"Избегайте распределений в горячих путях компилятора". Соглашения о кодировании Roslyn
Я читал раздел Сопутствующий код платформы .NET Compiler ( "Roslyn" ), и я наткнулся на руководящие принципы для кодирования. Я понимаю большую часть правил кодирования и почему они просят об этом. Но я не понимаю, что они подразумевают под этим:
Избегайте выделения в горячих путях компилятора:
Избегайте LINQ.
Избегайте использования foreach над коллекциями, у которых нет перечислителя структуры.
Что такое "горячий путь компилятора"? И почему я должен избегать использования LINQ и избегать выполнения foreach над коллекциями, у которых нет перечислителя структуры?
Ответы
Ответ 1
Компилятор горячие пути - это пути выполнения кода в компиляторе, в котором большая часть времени выполнения расходуется и которые потенциально выполняются очень часто.
Причиной исключения (кучи) в этих путях кода является то, что распределения могут инициировать сбор мусора, что может привести к внезапным и экстремальным ухудшениям производительности. Очевидно, этого следует избегать в очень часто исполняемых кодах кода.
Linq и foreach
выделены, поскольку они будут неявно распределять память - если ваш GetEnumerator
не возвращает struct
, который не будет вызывать распределения кучи.
Ответ 2
"Горячий путь" - это путь кода, который наиболее критичен для производительности. Это фрагменты кода, которые выполняются миллионы или миллиарды раз в секунду, занимая большую часть времени выполнения.
Как я прочитал, два других являются примерами ситуаций, которые могут вызывать неявные распределения, и поэтому их следует избегать в критичных для производительности частях кода.