Обновление : как и следовало ожидать, здравый совет сообщества в ответ на этот вопрос заключался в том, чтобы «измерить и увидеть». chibacity опубликовал ответ с несколькими действительно хорошими тестами, которые сделали это для меня;тем временем я написал собственный тест;и разница в производительности, которую я увидел, была на самом деле настолько огромной, что я чувствовал себя обязанным написать пост в блоге об этом.
Однако я также должен признать объяснение Ганса , чтоАтрибут ThreadStatic
действительно не является свободным и фактически использует магический метод CLR для выполнения своей магии.Это делает далеко не очевидным, будет ли подходящей оптимизацией применяться в любом произвольном случае.
Хорошая новость для меня заключается в том, что в моем случае, похоже, достигнутбольшое улучшение.
У меня есть метод, который (среди многих других вещей) создает несколько средних массивов (~ 50 элементов) для нескольких локальных переменных.
После некоторого профилирования яМы определили этот метод как узкое место в производительности.Дело не в том, что для вызова метода требуется очень много времени;скорее, его просто называют много раз, очень быстро (от сотен тысяч до миллионов раз за сеанс, который займет несколько часов).Так что даже относительно небольшие улучшения его производительности должны стоить.
Мне пришло в голову, что, возможно, вместо выделения нового массива при каждом вызове, я мог бы использовать поля, отмеченные [ThreadStatic]
;всякий раз, когда метод вызывается, он проверяет, инициализировано ли поле в текущем потоке, и, если нет, инициализирует его.С этого момента все вызовы в одном и том же потоке будут иметь массив, готовый к работе в этой точке.
(Метод инициализирует каждый элемент в самом массиве, поэтому наличие «устаревших» элементов в массиве не должнобыть проблемой.)
Мой вопрос прост: кажется ли это хорошей идеей?Есть ли подводные камни в использовании атрибута ThreadStatic
таким образом (т. Е. В качестве оптимизации производительности для снижения затрат на создание новых объектов для локальных переменных), о которых мне следует знать?Возможно, производительность самого поля ThreadStatic
невелика;например, есть ли много дополнительных «вещей», происходящих в фоновом режиме, с собственным набором затрат, чтобы сделать эту функцию возможной?
Мне также вполне вероятно, что я даже не пытаюсь пытатьсяоптимизировать что-то столь же дешевое (?), как массив из 50 элементов - и если это так, определенно дайте мне знать - но вопрос general все еще остается в силе.