2013-10-25 50 views
1
timespec start, end; 
clock_gettime(CLOCK_MONOTONIC, &start); 
---code--lookup in a unordered map <string, int> 
clock_gettime(CLOCK_MONOTONIC, &end); 
int diff = diff_ns(end, start); 

Results: 
SAMPLE MIN(ns) MAX(ns) AVG(ns) 
      100  1000  3000  1430 
      500  1000  2000  1436 
      1000   0  16000  1441 
      5000   0  15000  1479 
     10000   0  26000  1489 
     50000   0 363000  1589 
     100000   0 110000  1591 
     200000   0 804000  1659 
     300000   0 118000  1668 
     400000  1000 354000  1701 
     500000   0 8679000  1712 
     600000   0 809000  1701 
     700000   0 373000  1704 
     800000   0 850000  1716 
     900000   0 856000  1736 
     1000000   0 817000  1730 
  • 如何忽略CPU花費來計算clock_gettime時間,在我們需要時間結束時的一些問題也花了由clock_gettime電話嗎?在C++性能測量

  • 我運行在單線程程序測試......但如何確保沒有上下文切換髮生,因爲其他進程可能還對VM

    運行
  • 有時我得到採取零時間,因爲我測量的是納秒,我發現它很奇怪,在零納秒時如何執行某些操作?

回答

4

我運行在單線程程序測試......但如何確保沒有上下文切換髮生,因爲其他進程可能還對VM

運行

殺死所有進程這是不需要的,如果您有選項,請提高配置文件過程的優先級。

除此之外,您可以使用profcallgrind來分析您的程序。

有時我會得到零時間,因爲我測量的是納秒,我發現它很奇怪,在零納秒時如何執行某些操作?

由於CPU時鐘精度高於10毫秒,所以執行時間爲0 ns。

測量更多迭代後的時間,你會得到更好的結果。


多做查找,然後平均價值:

timespec start, end; 
clock_gettime(CLOCK_MONOTONIC, &start); 
for (int i=0;i<10000;++i) 
---code--lookup in a unordered map <string, int> 
clock_gettime(CLOCK_MONOTONIC, &end); 
int diff = diff_ns(end, start)/10000; 

像這次在clock_gettime花費將被忽略。

+0

如果每做n次迭代測量,我該如何計算最小/最大值。 – Medicine

+0

@Medicine做更多的查找,然後平均值。如果你只做一個無序地圖查找,那麼用N代替,並將測量時間除以N--其中N是一個很大的數字(10000+) –

+0

@BЈовић明白了。謝謝。 – Medicine