2010-11-27 66 views
6

在確定準確的算法在我的程序是如何運行的快,我一直在與QueryPerformanceFrequency的()結合使用QueryPerformanceCounter的(),當我使用的是酷睿i5但是會發生什麼/ 7架構?確定程序運行時間

是否有可能渦輪增壓會突然踢中途通過我的算法,突然我的表演定時器不再準確,因爲我的時鐘頻率不再是一個常數或這真的不是一個問題?如果這是一個問題,那麼準確計算算法的更好方法是什麼?

+0

是的渦輪增壓可以踢英寸很好的觀察:) – basarat 2010-11-27 07:39:20

回答

3

簡單地說,是的,任何事情都有可能發生。現代CPU只是簡單地估計真實世界的表現,該死的難以做到。這並不僅限於最新的Intel x86-64 cpus,它同樣適用於8位PIC微控制器以及其間的所有內容。

的唯一合理的事情怎麼辦呢是剛剛測試更多。您需要執行多次重複測試才能獲得關於實際工作負載的實際硬件上實際運行時性能的準確信息。另一方面,如果一種算法在同一硬件上(「在我的機器上」)優於另一種算法,那麼它通常會在其他設置上給出類似的比較結果,儘管它可能因恆定因子而變化。

+0

所以我真的應該看看一個算法進程的平均CPU週期數,而不是按頻率劃分,並得到一個納秒的時間? – Faken 2010-11-27 07:45:09

2

這裏有QueryPerformanceCounter的主題的有趣的文章:

http://www.virtualdub.org/blog/pivot/entry.php?id=106

顯然,VirtualDub的花花公子停止使用它,而現在有利於timeGetTime。一個很好的閱讀。

我建議使用的Boost.Date_Time,特別是的boost ::了posix_time東西。

1

實際上有兩個獨立的位置的問題:任何給定的定時方法的

  1. 可靠性時CPU的時鐘頻率的變化(通過例如智能加速增加或由於例如功率節省或熱管理踢的減小) - 這在一些其他答案中得到了解決

  2. 基準測量的可靠性(給出可靠的時鐘) - 這是更成問題的 - 如果您正在進行優化並尋找小的改進,例如大約10%,那麼很容易被Turbo Boost的時鐘變化的影響誤導。可能的解決方案是:

    2.1。禁用智能加速和其它時鐘頻率縮放

    2.2。足夠長的時間運行的基準,平均出時鐘速度變化

1

爲QPC利用定時信號源是傳統上從未從時鐘頻率得到的。儘管如此,主板製造商一直在偷工減料,試圖削減1美分或2美分。他們通常從芯片組的某個地方拾取一個頻率。我聽說有人的QPF值爲2 GHz的AMD機器,這個危險性接近於乘法後CPU時鐘的值。只有當你獲得這樣的大價值時纔會緊張。

QPC的絕對值應該是從來沒有是您關心的問題。這將主要取決於核心的質量。只有使用QPC測量才能查看代碼的漸進式改進。