Рассмотрим следующий код:Использует делегатов чрезмерно плохой идеей для производительности?
if (IsDebuggingEnabled) {
instance.Log(GetDetailedDebugInfo());
}
GetDetailedDebugInfo()
может быть дорогостоящим методом, поэтому мы хотим, чтобы назвать это, если мы работает в режиме отладки.
Теперь, уборщик альтернатива закодировать что-то вроде этого:
instance.Log(() => GetDetailedDebugInfo());
Где .log() определяется как:
public void Log(Func<string> getMessage)
{
if (IsDebuggingEnabled)
{
LogInternal(getMessage.Invoke());
}
}
Моя забота с производительностью, предварительное тестирование Безразлично» t показывает, что второй случай будет особенно дорогим, но я не хочу сталкиваться с неожиданностями при увеличении нагрузки.
О, и, пожалуйста, не предлагайте условную компиляцию, потому что это не относится к этому случаю.
(PS: Я написал код прямо в StackOverflow Задать вопрос текстовое поле, так что не обессудьте, если есть тонкие ошибки и не компилирует, вы получите точку :)
Прост достаточно, чтобы имитировать повышенную нагрузку; вы можете настроить тестовый пример для запуска обеих опций внутри жестких циклов для нескольких десятков тысяч итераций и сравнения. – Amber