dotTrace和秒表功能计时的巨大差异

时间:2015-03-24 22:55:49

标签: profiling dottrace

在我的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中分析代码。

1 个答案:

答案 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 Typescomparison of profiling types帮助页。