Если ваше приложение передает около 700-байтовые XML-сообщения, которые могут содержаться в сообщениях протокола по протоколу 64 байта или сообщениях с ASB-сообщением по 85 байт, это, вероятно, не имеет значения. Но если он обрабатывает миллион штук в секунду, я бы не отказался от стоимости добавления двух полных циклов read write write (RMW) к прохождению указателя.
Полностью прочитанный вариант изменения записи составляет порядка 50 нс, а два - 100 нс. Эта стоимость представляет собой стоимость блокировки и блокировки-dec - то же, что и 2 CAS. Это половина резерва и освобождения от критического раздела Windows.Это сравнивается с одним нажатием одного машинного цикла (400 секунд PICO на машине 2,5 ГГц)
И это даже не включает другие затраты на аннулирование строки кэша, которая фактически содержит счет, последствия блокировки BUS на других процессорах и т. д. и т. д.
Передача интеллектуальных указателей по ссылке const почти всегда ВСЕГДА. Если вызываемый пользователь не создает новый общий указатель, когда он хочет гарантировать или контролировать время жизни получателя , то это ошибка в вызываемом абоненте. Чтобы волей-неволей передавать потоки, безопасные ссылки, считающие интеллектуальные указатели вокруг значения, просто требуют получения производительности.
Использование ссылочных счетных указателей упрощает жизнь, без сомнения, но передавать общие указатели по достоинству, чтобы попытаться защитить от дефектов в вызываемой стороне, является чистой и полной бессмыслицей.
Чрезмерное использование подсчета ссылок может в короткий срок превратить небольшую программу, которая может обрабатывать 1 мм сообщений в секунду (м/с) в жирную, которая обрабатывает 150 тыс. М/с на одном и том же оборудовании. Внезапно вам понадобится половина стойки серверов и 10000 долларов в год на электричестве.
Вам всегда лучше, если вы можете управлять временем жизни объектов без подсчета ссылок.
Примером простого улучшения можно сказать, что если вы собираетесь разветвлять объект, и вы знаете, что ширина разветвления (скажем n) увеличивается на n, а индивидуально увеличивается на каждом разветвлении.
BTW, когда процессор видит префикс блокировки, он действительно говорит: «О нет, это будет больно».
Все, что касается меня, я согласен со всеми, что вы должны проверить горячую точку.
Хех. Здесь нет ответа, но мне просто нравилось, как заголовок был сформулирован. Я представляю, как процессор весело выполняет инструкции, когда вдруг видит, что команда общего указателя вводит конец конвейера. «О нет, это будет huuuuurt ...... OW!» –
Что заставляет вас думать, что проблема заключается в общих указателях? –
Наличие людей, говорящих, что они тратят время процессора, вот оно: P – Guest