我如何充分了解CLR对性能问题做出有根据的猜测?

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).

现在,我想了解为什么我所做的事情提高了性能.你建议我读什么书?

小智 10

CLR通过C# by Jeffrey Richter.

这是一本非常好的书,有人在我的图书馆里与C#一起偷了它.