есть скрытая стоимость, которая оплачивается позже: "GC"

итьКак и следовало ожидать, здравым советом сообщества в ответ на этот вопрос было «измерить и увидеть».Chibacity опубликовал ответ с некоторыми действительно хорошими тестами, которые сделали это для меня; тем временем я написал собственный тест; и разница в производительности, которую я видел, была на самом деле настолько велика, чтоЯ чувствовал себя обязанным написать сообщение в блоге об этом.

Тем не менее, я должен также признатьОбъяснение Ганса чтоThreadStatic Атрибут действительно не является свободным и фактически использует магический метод CLR. Это делает далеко не очевидным, будет ли подходящей оптимизацией применяться в любом произвольном случае.

Хорошей новостью для меня является то, что вмой Случай, кажется, сделал большое улучшение.

У меня есть метод, который (среди прочего) создает несколько средних массивов (~ 50 элементов) для нескольких локальных переменных.

После некоторого профилирования я определил этот метод как узкое место в производительности. Дело не в том, что для вызова метода требуется очень много времени; скорее это просто называетсямного очень быстро (от сотен тысяч до миллионов раз за сеанс, который займет несколько часов). Поэтому даже относительно небольшие улучшения его производительности должны быть оправданы.

Мне пришло в голову, что, возможно, вместо выделения нового массива при каждом вызове, я мог бы использовать поля, отмеченные[ThreadStatic]; всякий раз, когда метод вызывается, он проверяет, инициализировано ли поле в текущем потоке, и, если нет, инициализирует его. С этого момента все вызовы в одном потоке будут иметь массив, готовый к отправке в этот момент.

(Метод инициализирует каждый элемент самого массива, поэтому наличие «устаревших» элементов в массиве не должно быть проблемой.)

Мой вопрос просто так: кажется ли это хорошей идеей? Есть ли подводные камни для использованияThreadStatic атрибут (таким образом, как оптимизация производительности, чтобы снизить стоимость создания новых объектов для локальных переменных), о котором я должен знать? Является ли производительностьThreadStatic само поле возможно не велико; например, есть ли много дополнительных «вещей», происходящих в фоновом режиме, с собственным набором затрат, чтобы сделать эту функцию возможной?

Для меня также вполне вероятно, что я ошибаюсь, даже пытаясь оптимизировать что-то столь же дешевое (?), Как массив из 50 элементов - и если это так, определенно дайте мне знать - ноГенеральная Вопрос все еще остается в силе.

Ответы на вопрос(0)

Ваш ответ на вопрос