C#如何确定代码的慢速部分在哪里?

时间:2009-01-28 00:32:52

标签: c# profiling performance

我的编码时间不长,所以我不熟悉哪种技术最快,所以我想知道在VS或第三方工具中是否有办法做到这一点?

由于

11 个答案:

答案 0 :(得分:17)

好的,请注意时间......

Profilers非常适合测量。

但你的问题是“我怎样才能确定代码的缓慢部分在哪里?”。

这是一个不同的问题。这是诊断,而不是测量。

我知道这不是一种流行的观点,但这是真的。

这就像是一家试图削减成本的企业。

一种方法(自上而下)是衡量总体财务状况,然后按类别和部门细分,并尝试猜测可以消除的内容。 这是衡量标准。

另一种方法(自下而上)是随意走进办公室,随意挑选某人,并询问他们当时正在做什么,(重要的是)详细说明原因。

不止一次这样做。

这就是哈里杜鲁门在二战爆发时在美国国防工业中所做的事情,并通过访问几个网站立即发现了大规模的欺诈和浪费。 那是诊断。

在代码中,您可以通过一种非常简单的方式执行此操作:“暂停”它并询问它为何花费该特定周期。通常,调用堆栈会详细告诉您原因。

不止一次这样做。

这是抽样。一些分析器对调用堆栈进行采样。但由于某种原因,他们坚持总结每个功能所花费的时间,包容性和排他性。这就像是商业部门的总结,包容性和排他性。

它会丢失您需要的信息,这是细粒度的细节,告诉您是否需要循环。

回答您的问题:

暂停几次程序,每次捕获调用堆栈。如果你的代码非常慢,那么浪费的函数调用几乎都在每个堆栈上。它们将精确指向“代码的缓慢部分”。

ADDED:RedGate ANTS即将到来。它可以为您提供成本,而且非常漂亮。所以如果你在.NET中,并且可以节省3个数字,并且不介意等待安装&了解它,它可以告诉你许多你的Pause键可以告诉你什么,并且更加漂亮。

答案 1 :(得分:9)

分析]。

RedGate有一个产品 JetBrains有一个产品。

答案 2 :(得分:2)

我使用过ANTS Profiler,我可以通过推荐加入其他人。

当您将它与将为您节省开支时间的数量进行比较时,价格是不可接受的。

我是开发人员,您的公司不会为您购买,无论是更换公司还是自己购买。

答案 3 :(得分:2)

对于分析大型复杂UI应用程序,您通常需要一组工具和方法。我将概述最近在项目中使用的方法和工具,以提高.Net 2.0 UI应用程序的性能。

首先,我采访了用户并亲自处理了用例,提出了一系列目标用例,这些用例突出显示了系统性能较差的系统。即我不想花费很多时间来优化一个几乎没有使用但很慢的功能。我想花时间,但是,优化一个有点迟钝的功能,但每天调用1000次,等等。

一旦确定了候选用例,我就使用自己的轻量级日志记录类对我的代码进行了检测(我使用了一些高性能计时器和自定义日志记录解决方案,因为所需的亚毫秒精度)。但是,您可以使用log4net和时间戳来逃脱。我对代码进行检测的原因是,有时更容易读取自己的日志而不是分析器的输出。我出于各种原因需要两者(例如,使用分析器测量.Net用户控件布局并不总是很简单。)

然后我使用ANTS探查器运行我的检测代码并分析用例。通过结合ANTS配置文件和我自己的日志文件,我很快就能发现我们的应用程序出现问题。

我们还分析了服务器和UI,并能够计算出在UI中花费的时间,在线上花费的时间,在服务器上花费的时间等的细分。

另外值得注意的是,1次运行是不够的,第1次运行通常值得扔掉。让我解释一下:PC负载,网络流量,JIT编译状态等都会影响特定操作所需的时间。一个简单的策略是测量一次操作n次(比如5次),扔掉最慢和最快的运行,分析重新调整的轮廓。

答案 4 :(得分:2)

Eqatec profiler是一款可爱的小型探测器,免费且易于使用。它在功能方面可能不会接近蚂蚁剖析器的“哇”因素,但它仍然是非常酷的IMO,值得一看。

答案 5 :(得分:1)

使用profilerANTS要花钱,但非常好。

答案 6 :(得分:0)

ANTS Profiler非常好。

答案 7 :(得分:0)

ANTS Profiler的

Tutorial/Explanation

答案 8 :(得分:0)

如果您不想付款,较新的VS版本会附带一个分析器,但说实话,这似乎不太好。 ATI / AMD制作了一个免费的分析器...但它不是非常用户友好(对我来说,我无法获得任何有用的信息)。

我给出的建议是使用代码自行调用函数。如果它们很快并且您没有高精度计时器或者呼叫因慢速而变化有很多原因(例如,每个x调用构建某种缓存),请尝试运行每个x10000次或类似的事情,然后将结果分开因此。对于某些代码部分而言,这可能并不完美,但如果您无法找到一个好的,免费的第三方解决方案,除非您想付费,否则它几乎就是剩下的。

答案 9 :(得分:0)

另一种选择是英特尔的VTune

答案 10 :(得分:0)

我只是设置了断点,visual会告诉你断点之间有多少ms。所以你可以手动找到它。