2015-03-24 59 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幫助頁面。