2011-04-19 75 views
1

我有兩個塊做相同的操作代碼。一個是我自己寫的,另一個是第三方寫的。它們都被編譯成一個可執行文件。第三方代碼似乎能夠比我的工作快得多。與我的500相比,它可以每秒執行1,500次操作。然後,我使用調用圖分析選項在VTune中運行可執行文件,希望這能夠顯示我浪費時間的地方。不幸的是,VTune診斷程序顯示它認爲每個函數需要的微秒數,聲稱這兩個我的函數和第三方函數每次調用大約需要0.002秒。這是我的代碼的亮點,但完全不符合我對第三方代碼速度的(手動)測量。Profiler與真實時機報告的時間 - 爲什麼差異?

這是怎麼發生的?

編輯:這兩個代碼塊都很大,並調用他們自己的複雜子樹功能。

編輯:我應該指出,第三方代碼是純粹的C++,而我的代碼基本上是C編譯的C代碼。

編輯:VTune是一個非常複雜的軟件包,帶有負載的配置選項我不明白。可能有一些設置可以降低這種不準確性嗎?

+0

如果您將它們編譯到同一個可執行文件中,您可能會得到緩存或堆作用,從而使第一次或第二次測試運行速度最快。更改訂單有時會改變結果! – 2011-04-19 15:54:55

回答

2

'true timing'的定義可能需要修訂。比較蘋果和梨時,你不能聲稱探查器是錯誤的。

輪廓儀可用於相對定時;使用探查器在代碼中查找「熱點」,然後使用這些信息優化該區域。

在實踐注:尋找一個採樣分析器,它通常具有比跟蹤開銷/衝擊小得多/插裝探查

0

我(PS 上薛定諤/海森堡又讀了)我們看到了一些情況,其中剖析器人爲地誇大了某些函數/系統調用的報告時間。這可能是因爲第三方圖書館正在使用一些此類電話並與之掛鉤。

您是否嘗試過使用高性能時鐘(Solaris中的gethrtime或Windows中的QueryPerformanceCounter)並測量函數的總次數作爲完整性檢查?

你的操作聽起來很慢CPU綁定 - 它們是I/O綁定?您的I/O代碼是否比圖書館的優化程度低?這不一定會顯示在CPU配置文件報告中。

+0

QueryPerformanceCounter是我的手動計時機制。 – Mick 2011-04-19 13:59:46

+0

它的所有CPU綁定 - 功能做了很多東西! – Mick 2011-04-19 14:00:17

0

如果您使用掛牆時間(即經過的秒數而不是CPU計數器),則還需要考慮阻塞系統調用所花費的時間。例如,假設你沒有做太多的文件I/O,你可能花費大量的時間將信息輸出到控制檯。控制檯I/O不會顯示爲CPU時間,因爲大部分時間只是等待更新控制檯。

您可以使用GetThreadTimes(...)來確定您的代碼花費在系統代碼上的時間。我已經使用這個和系統調用採樣來減少上下文切換(並最終提高整體性能)。