在我的C#应用程序中分析几个函数的性能。我正在使用.Net秒表计时超过20,000次通话。每次通话时间约为2.8毫秒。
然而,当逐行模式使用dotTrace时,我发现对我的函数的20,000次调用需要249,584ms,即每次调用约12.5ms。
现在,该功能被附加到一个调度计时器,因此秒表位于该功能内部而不是注册该调用本身。像这样:
private static Stopwatch myStop = new Stopwatch();
private MyFunction(object obj, EventArgs e)
{
myStop.Start()
//Code here
myStop.Stop();
Console.WriteLine("Time elapsed for View Update: {0}", myStop.Elapsed);
myStop.Reset();
}
然而,我发现很难相信这个电话平均需要10毫秒。
还有什么可能影响探查器或秒表的时间吗?调度计时器事件会影响时间吗?
我查看了一些JetBrains论坛,但却无法找到任何与此相关的内容,但我确信我可以更加努力并继续这样做。我确实知道秒表在某些方面是不可靠的,但并不认为它可能是这么多。
应该注意的是,这是我第一次在C#或.Net中分析代码。
答案 0 :(得分:0)
简短回答:逐行分析比任何其他分析类型都有最大的开销。
对于逐行分析,dotTrace(以及其他分析器)将调用某些分析器的函数,让我们调用它,例如GetTime(),它计算从前一次调用中花费的时间,对它进行求和并写入快照中的某个地方。
所以你的功能不再如此快速和简单。 如果没有分析您的代码,可以看起来像这样:
myStop.Start();
var i = 5;
i++;
myStop.Stop();
如果你在探查器下启动它,它将是这样的:
dotTrace.GetTime();
myStop.Start();
dotTrace.GetTime();
var i = 5;
dotTrace.GetTime();
i++;
dotTrace.GetTime();
myStop.Stop()
所以12.5 ms你得到的包括所有这些探查器API调用并扭曲绝对功能时间很多。逐行分析主要用于比较相对语句时间。因此,如果要准确测量absoulte函数时间,则应使用采样分析类型。
有关分析类型的详细信息,请参阅dotTrace Profiling Types和comparison of profiling types帮助页。