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