考虑到CPU缓存的影响,您如何分析.net应用程序?

时间:2010-07-30 09:16:29

标签: .net profiling cpu-cache

我知道的所有.net配置文件都没有考虑到CPU缓存的影响。

鉴于从CPU缓存读取字段比从主存储器中读取字段快100倍,这可能是一个重要因素。 (我只需要在answer

中解释一下

我看到有太多人花了很长时间来加速循环,而分析器说这些循环很慢,而在现实生活中,cpu缓存使它们变得很快。


E.g我希望能够看到数据访问是否遗漏了很多cpu缓存,以及只是获得我可以信任的基本分析结果。

在过去,我发现通过使我的数据更加紧凑,它将全部适合CPU缓存,或者更改另一个数据访问可能会产生很大影响。 E.g。

AccessArrarFromStartAndDoSomething()  
AccessArrayFromEndAndDoSomethingElse()

那就好了

AccessArrarFromStartAndDoSomething()  
AccessArrayStartEndAndDoSomethingElse()

如果数组不适合CPU Cache,但很难找到那种类型的inprovment。


花费更多的cpu周期来使数据更小,以便它更适合CPU Cache,可以扩展很多系统,但大多数分析器会指向另一个方向。

2 个答案:

答案 0 :(得分:0)

我可能误解了您的问题,但我认为答案只是将您的探查器切换为高精度,低细节模式。一个例子是使用ANTS Performance Profiler's新的采样模式:

http://www.simple-talk.com/community/blogs/andrewh/archive/2009/11/13/76420.aspx

答案 1 :(得分:0)

  

我见过太多人花了一个   长时间加速循环a   探测器说实际上很慢   生活中的cpu缓存使它们变得快速。

有些分析师非常擅长胡说八道。

您的总体目标是什么?你想让计算在更短的时间内完成吗?

如果没有,请忽略此答案。

如果是这样,你需要知道是什么造成了你可以摆脱的挂钟时间。

这不是关于计时的准确性。这是关于位置的准确性。我建议你真正需要知道的是哪一行代码都是1)负责花费合理的时间,2)可以做得更好或根本不做。这就是你需要知道的,因为如果没有这样的代码行,那么你要优化什么?

找到这样的代码行的一种很好的方法是1)在调用堆栈的挂钟时间(不是cpu-time)上取样的任何分析器 ,2)告诉你,对于出现在调用堆栈中的每个代码行(非函数),它出现的堆栈的百分比。您的优化候选线是具有较大百分比的线。 (一些非网络示例:ZoomLTProf。)

坦率地说,我使用的探查器就是你已经拥有的探测器。我只是在程序缓慢的时候暂停程序并查看堆栈。我不需要很多样品。实际上,如果有一行代码我可以不用,如果它出现在两个样本上,我知道它值得修复,并且到达那一点所需的样本越少,它更大。 Here's a more thorough explanation.

几乎总有多个“瓶颈”。所以我找到一个大的,修复它,再做一遍。修复瓶颈对剩余瓶颈的影响是 - 它使它们更大。这种“放大效果*允许你继续前进,直到没有更多的速度挤出来。