2009-06-29 3 views
3

В последнее время, я принял к образцу, имеющие много данных диагностики в части моего кода, что делает использование лямбда-выражения/анонимных делегатов, как так:Возможно ли иметь слишком много анонимных делегатов?

MyEventManager.LogVerbose(LogCategory.SomeCategory,() => String.Format(msg_string, GetParam1(), GetParam2(), GetParam3()); 

Обратите внимание, что второй аргумент LogVerbose является выражение лямбда, которое оценивает строку. Причиной этого является то, что если ведомое ведение журнала фактически не разрешено, LogVerbose должен выйти, выполнив как можно меньше работы, чтобы минимизировать влияние производительности. Построение строки сообщения об ошибке может в некоторых случаях занять время или ресурсы, и если выражение лямбда никогда не будет оценено, это нарушение производительности не будет понесено.

Мне интересно, может ли засориться система типов с таким количеством анонимных делегатов, как это, будет иметь некоторые непредвиденные последствия для производительности приложения или если есть какие-либо другие стратегии, которые я должен рассмотреть.

ответ

2

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

Если вы захватили локальные переменные, это будет включать в себя создание экземпляра вложенного типа, но я бы об этом беспокоился, если бы увидел, что это действительно становится проблемой. Как и прежде с оптимизацией, сначала сосредоточьтесь на удобочитаемости, измерьте производительность, а затем профилируйте ее, чтобы узнать, где вам нужно сосредоточить свои усилия.

+0

Это то, что я подозревал, это техническое обоснование. – jlew

2

Хотя я действительно не знаю наверняка ответ на вопрос, я считаю, что его стоит считать, что диск с более функциональным стилем программирования на C# будет серьезно подорван, если бы было какое-то предположение о том, что какой-то вид ограничения на использование таких выражений.

2

У меня есть решение, в котором есть тысячи делегатов анонов, и оно все еще работает. Иногда Visual Studio немного неуклюж, но это потому, что у нас есть сотни проектов или этот или какой-то другой фактор неизвестен. Производительность приложений, похоже, не сильно пострадала (с довольно небольшим количеством перфометрических тестов).

Смежные вопросы