Использует ли интерполяция строк С# 6 бокс, как это делает string.Format() для своих аргументов?

Я спрашиваю об этом ради производительности - использование большого количества боксов приводит к большому распределению кучи, что приводит к увеличению количества сборов GC, что иногда приводит к зависанию приложений, что раздражает пользователей.


person Ognyan Dimitrov    schedule 19.10.2016    source источник
comment
Согласно этому связанному сообщению интерполяция строк преобразуется в string.Format() во время компиляции. См. также здесь.   -  person Axel Kemper    schedule 19.10.2016


Ответы (1)


Все, что делает интерполяция строк (по крайней мере, в общем случае), это вызов string.Format().

Прямо сейчас вызов string.Format() выделяет довольно много ресурсов, и не только из-за бокса (например, string.Format("{0:s} - {1:B}: The value is: {2:C2}", DateTime.UtcNow, Guid.NewGuid(), 3.50m) делает 13 аллокаций, только 3 из них из-за бокса), хотя есть разговоры об улучшении этого в будущем.

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

person svick    schedule 19.10.2016
comment
имеет известные проблемы с производительностью. - это вообще проблема производительности? Нынешняя система String.Format была разработана еще в 2000-2001 годах, когда вычислительные ресурсы были ничтожными по сравнению с сегодняшними, и я не припомню, чтобы у кого-то были проблемы с ней в то время — почему люди поднимают шум сейчас? - person Dai; 02.08.2020
comment
@Dai Это проблема с производительностью. Актуальна ли эта проблема для вас, зависит от множества факторов. И если это не имеет отношения к вам, вы должны просто игнорировать это. - person svick; 02.08.2020