"避免在编译器热路径中进行分配"Roslyn编码约定

Clo*_*ife 25 c# linq foreach conventions roslyn

我一直在阅读.NET编译器平台的贡献代码部分("Roslyn"),我遇到了编码约定的指南.我理解大多数编码约定以及为什么要求它.但我不明白他们的意思是:

避免在编译器热路径中进行分配:

避免使用LINQ.

避免在没有结构枚举器的集合上使用foreach.

什么是"编译器热门路径"?为什么我应该避免使用LINQ并避免对没有结构枚举器的集合进行预测?

Kon*_*lph 34

编译器热路径是编译器中的代码执行路径,其中大部分执行时间都花费了,并且可能经常执行.

在这些代码路径中避免(堆)分配的原因是分配可能触发垃圾收集,这可能导致突然的,极端的性能恶化.显然应该在非常常见的代码路径中避免这些.

Linq和foreach被挑出来因为这些将隐式分配内存 - 除非你GetEnumerator返回a struct,这不会导致堆分配.

  • @ gnasher729:Roslyn _is_一个UI应用程序; GC活动直接影响VS中的打字速度. (7认同)
  • gnasher729部分正确; 它只是我们在Roslyn代码库中关注的突然,极端性能恶化的部分原因.我们同样关注编译器的吞吐量.最小化分配可减少垃圾收集的数量,从而增加编译器的吞吐量. (3认同)

jal*_*alf 11

"热路径"是对性能最关键的代码路径.代码片段每秒执行数百万或数十亿次,占用了大部分执行时间.

在我阅读时,其他两个只是可能导致隐式分配的情况的示例,因此应该在代码的性能关键部分中避免.