English version.
Давно ничего не было про производительность. Сегодня про логирование и как оно влияет на производительность.
Если вы писали такой код:
// CA2254: The logging message template
// should not vary between calls
logger.LogDebug($"Request Id: {id} finished with Error: {error}");
...то, скорее всего замечали, что IDE настойчиво рекомендовала так больше не делать.
Почему? Потому что интерполированные строки — это синтаксический сахар.
После компиляции код будет выглядеть так:
var handler = new DefaultInterpolatedStringHandler(34, 2);
handler.AppendLiteral("Request Id: ");
handler.AppendFormatted(value);
handler.AppendLiteral(" finished with Error: ");
handler.AppendFormatted(value2);
string text = handler.ToStringAndClear();
logger.LogDebug(text);
Проблема здесь в том, что строка text создаётся всегда, даже если уровень логирования выше Debug и сообщение в лог не попадёт.
Более правильный вариант логирования выглядит так:
logger.LogDebug("Request Id: {Id} finished with Error: {Error}", Id, Error);В этом случае строковый шаблон "Request Id: {Id} finished with Error: {Error}" не будет использоваться, если, например, минимальный уровень логирования Information.
Лишних аллокаций удастся избежать… так я думал, пока не написал бенчмарки и не проверил результаты.
Читать полностью на сайте 👇🏻
P.S. Зацените обновлённый блог. Наконец-то закончил миграцию с Jekyll на Astro.