Ste*_*nov 10 .net c# clr optimization performance
是的,我正在使用分析器(ANTS).但在微观层面,它无法告诉你如何解决你的问题.我现在处于微观优化阶段.例如,我正在分析这个:
for (int x = 0; x < Width; x++)
{
for (int y = 0; y < Height; y++)
{
packedCells.Add(Data[x, y].HasCar);
packedCells.Add(Data[x, y].RoadState);
packedCells.Add(Data[x, y].Population);
}
}
Run Code Online (Sandbox Code Playgroud)
ANTS显示y环线占用了大量时间.我以为是因为它必须经常调用高度吸气剂.所以我在int height = Height;
循环之前创建了一个本地,并使内循环检查y < height
.这实际上使性能更糟!ANTS现在告诉我x-loop-line是个问题.咦?这应该是微不足道的,它是外循环!
最终我有一个启示 - 可能使用外部循环绑定的属性和内部循环绑定的本地CLR跳转经常在"本地"缓存和"this-pointer"缓存之间(我用过)考虑CPU缓存).所以我也为Width创建了一个local,并修复了它.
从那里,很明显我也应该为数据创建一个本地 - 即使数据甚至不是属性(它是一个字段).事实上这给我带来了更多的表现.
但令人费解的是,重新排序x和y循环(以提高缓存使用率)是零差异,即使阵列很大(3000x3000).
现在,我想了解为什么我所做的事情提高了性能.你建议我读什么书?