2010-07-14 52 views
1

我在秋季學習計算幾何課程,我們將在C或C++中實現一些算法並對它們進行基準測試。大多數學生使用time命令生成一些數據集並測量他們的程序,但我希望能夠更徹底一些。測量計算幾何算法的運行時間

我正在考慮編寫一個程序來自動生成不同的數據集,運行我的程序並使用R來測試假設和估計參數。

所以...你如何更準確地測量程序運行時間?

什麼可能與衡量有關?

什麼樣的假設可能會有趣的測試(方差,緩存造成的影響等)?

我應該在多臺機器上測試我的代碼嗎?這些機器應該如何區別?

我的總體目標是瞭解這些算法在實踐中的表現如何,哪些實現技術更好,以及硬件實際執行的方式。

+0

看不到這與C或C++有什麼關係。 – 2010-07-14 20:21:33

+2

@Neil Butterworth:OP說算法將用C或C++編寫。所以一切都需要基於它。 – 2010-07-14 20:23:52

回答

0

您可以使用Windows API計時功能(並非如此),您可以使用RDTSC內聯彙編程序命令,它精確到亞納秒級別(不要忘記命令及其周圍的指令會產生小的開銷幾百個週期,但這不是一個大問題)。

0

爲了與程序,以獲得更好的精度指標,你將不得不運行您的程序很多次,比如100或1000

有關詳細信息,關於指標,在網絡上搜索指標剖析

請注意,由於在後臺運行的應用程序(如病毒掃描程序,音樂播放器和其他具有計時器的程序)可能導致程序在性能(時間)測量上存在差異。

你可以在不同的機器上測試你的程序。處理器時鐘速率,L1和L2高速緩存大小,RAM大小和磁盤速度都是因素(以及同時運行的其他程序/任務的數量)。浮點也可能是一個因素。

如果需要,您可以通過打印各種優化設置的列表的彙編語言來挑戰編譯器。查看哪個設置產生最少或最有效的彙編代碼。

由於您處理數據,看看數據驅動的設計http://www.gamearchitect.net/Articles/DataDrivenDesign.html

+0

另一個網站(數據驅動的編程):http://ai.eecs.umich.edu/soar/Classes/494/talks/Schumaker.pdf – 2010-07-14 20:34:01

0

您可以使用Windows的高性能計數器以獲得精確到納秒。從技術上講,afaik,HPC可以是任何速度,但你可以查詢它的每秒計數,據我所知,大多數CPU做非常高的性能計數。

你應該做的只是得到一個專業的分析器。這就是他們的目的。然而更現實的一點。

如果你只是在算法之間進行比較,只要你的機器在一個區域(奔騰D,SSD類型的東西)中沒有發生擅長的事情,在一臺機器上執行它應該沒有太大的關係。如果您想查看緩存效果,請在機器啓動後立即嘗試運行算法(確保您獲得Windows 7的副本,對於CS學生應該是免費的),然後讓它做一些可能會大量緩存的重量,像圖像處理,24小時或者說服操作系統緩存它。然後再次運行算法。比較。

+0

關於架構/機器無關緊要的說法是錯誤的,每個架構都是因爲技術隨着時間的推移而有所不同。 聲稱板凳需要一天緩存「填滿」也是錯誤的,L1/L2緩存填充幾個鍾/微秒,所以沒有必要「讓它運行十年」。 – Quonux 2010-07-14 20:34:14

+0

你完全誤解了我的帖子。每個架構都不同,但算法不會。如果它的性能比率大致相同,算法的相對性能將保持不變。另外,填充L1/L2緩存可以說服操作系統這樣做,而不是讓CPU去做。 – Puppy 2010-07-14 22:03:26

+0

操作系統負責填充它自己的文件緩存 - 在主內存中。 L1/L2緩存是CPU的一部分,由它管理。 – 2010-07-15 10:07:12

0

您沒有指定您的平臺。如果你在POSIX系統上(例如linux)查看clock_gettime。這使您可以訪問不同種類的時鐘,例如掛鐘時間或CPU時間。你也可能知道時鐘的精確度。

既然你願意對你的數字做出很好的統計,你應該經常重複你的實驗,以便統計測試給你足夠的信心。

如果你的測量結果不是很精細,而且差異很小,那麼對於10個探針,這通常是相當不錯的。但是,如果你做到小規模,一個簡短的功能,你可能需要高得多。你

還必須確保可重複的實驗條件下,機,內存不夠等

1

廓線儀是偉大上沒有其他負載。 Valgrind很受歡迎。另外,如果你可以訪問一些,我建議你在risc機器上試用你的代碼。它們的性能特徵與有趣的方式不同。