2015-03-24 69 views
0

C#应用程序中夫妇函数的性能分析。我使用.Net秒表来计时超过20000个电话的功能。时间到了每次通话约2.8ms。dotTrace和秒表功能计时的巨大差异

但是,当在逐行模式下使用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

简短回答:逐行分析比其他分析类型的开销最大。

对于逐行分析,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.5ms的你得到包括所有这种探查API调用和扭曲绝对功能时间很多。逐行分析主要需要比较相对报表时间。所以如果你想准确测量absoulte函数时间,你应该使用采样剖析类型。

有关分析类型的更多信息,请参阅dotTrace Profiling Typescomparison of profiling types帮助页面。