Подтвердить что ты не робот

"Избегайте распределений в горячих путях компилятора". Соглашения о кодировании Roslyn

Я читал раздел Сопутствующий код платформы .NET Compiler ( "Roslyn" ), и я наткнулся на руководящие принципы для кодирования. Я понимаю большую часть правил кодирования и почему они просят об этом. Но я не понимаю, что они подразумевают под этим:

Избегайте выделения в горячих путях компилятора:

Избегайте LINQ.

Избегайте использования foreach над коллекциями, у которых нет перечислителя структуры.

Что такое "горячий путь компилятора"? И почему я должен избегать использования LINQ и избегать выполнения foreach над коллекциями, у которых нет перечислителя структуры?

4b9b3361

Ответ 1

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

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

Linq и foreach выделены, поскольку они будут неявно распределять память - если ваш GetEnumerator не возвращает struct, который не будет вызывать распределения кучи.

Ответ 2

"Горячий путь" - это путь кода, который наиболее критичен для производительности. Это фрагменты кода, которые выполняются миллионы или миллиарды раз в секунду, занимая большую часть времени выполнения.

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