我一直在阅读.NET编译器平台的Contributing Code部分(" Roslyn"),并且我遇到了编码约定的准则。我理解大多数编码约定以及为什么要求它。但我不明白这是什么意思:
避免在编译器热路径中进行分配:
避免使用LINQ。
避免在没有结构枚举器的集合上使用foreach。
什么是#34;编译器热门路径"?为什么我应该避免使用LINQ并避免对没有结构枚举器的集合进行预测?
答案 0 :(得分:31)
编译器hot paths是编译器中的代码执行路径,其中大部分执行时间都花费了,并且可能经常执行。
在这些代码路径中避免(堆)分配的原因是分配可能会触发垃圾回收,这可能会导致突然的极端性能恶化。显然应该在非常常见的代码路径中避免这些。
Linq和foreach
被挑选出来,因为这些将隐式地分配内存 - 除非你的GetEnumerator
返回struct
,这不会导致堆分配。< / p>
答案 1 :(得分:11)
“热路径”是对性能最关键的代码路径。代码片段每秒执行数百万或数十亿次,占用了大部分执行时间。
在我阅读时,其他两个只是可能导致隐式分配的情况的示例,因此应该在代码的性能关键部分中避免使用。