Re: [問題] 如何精準計算 運算元(+ - * /)時間
這是一大段測時的問題, 既你是用 Visual Studio C++,
那我一次把心得全放上來, 免得你日後還會有問題。
先聲明一件事, 我對 asm 分析不行, 但對 wall time 分析應算小有研究。
※ 引述《ouyang0916 ()》之銘言:
: 開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
: VC++
這是一個重點,記得標版本。
: 錯誤結果(Wrong Output):
: 0 (時間太快?我做了10000000次也是這個結果)
: 程式碼(Code):(請善用置底文網頁, 記得排版)
: http://dpaste.com/hold/571946/
: 補充說明(Supplement):
: 我還想測試 加法 減法 模數 乘法 ...等時間分析
: 感謝大大們的指導
恕刪。
---------------
→
07/20 11:18,
07/20 11:18
推
05/10 18:21,
05/10 18:21
→
05/10 18:22,
05/10 18:22
→
05/10 18:22,
05/10 18:22
for(i=0;i<size;i++){
x=Logistic(x); //chaos map
k=ftoint(x); //Flotation point number to integer conversion
}
time2 = clock();
原因在於, VC 他太聰明了, 他知道你這裡的 k 是白算的, 因為最後結果根本沒用到 k,
所以開 O2 時就避掉了, 我猜那段根本就沒放進來,
你可適當的在 time2 「之後」做這件事:printf("k=%d\n", k);
即時這樣,目前你算出來的應還是 0 secs,這次的原因是在於「是真的太快」。
以下有幾種解法,可適用於大多數的情況
--------------
1. 執行 TIMES 次
#define TIMES UINT_MAX
unsigned times=TIMES;
t1=clock();
while(--times) {
// initialize value
// your test function
}
t2=clock();
評論:這方法是我常用的,但這方法本身就有用到減法、比較指令,
而你本身要測的就是五則運算,可能不會非常準。
---------------
2. 換計時器
其實你有一段碼是沒意義的 printf (" %.20f seconds \n", total );
(a) 浮點數精度只到 15.22 位,意思是到第 16 位完全沒參考價值。
(b) 計時器本身誤差問題 : 計時器本身就會有誤差,
這裡的誤差和精度(CLOCK_PER_SEC)並不一樣,意思是 clock() 誤差不只 1ms
我是沒測過 clock() 本身誤差是多少, 但可以確定的是, 是「數十」個 ms
(可能是 16~55 )
Visual C++ 要其它計時器的話 http://edisonx.pixnet.net/blog/post/52113788
你的問題我建議用 QueryPerformanceCount / QueryPerformanceFrequency,
同樣的 code, 加上輸出 k, 我這裡最後得到的不是 0 sec, 而是
0.0004134603699632 seconds.
要更精準的話, Visual C++ 調用 __rdtsc()
http://msdn.microsoft.com/en-us/library/twchhe95(v=vs.80).aspx
但這指令有公開爭論、討伐過, 好不好用, 待議 (我本身會用就是了)
------------------
3. 以上步驟仍失敗的話
目前你上面的 code 加輸出就正常了, 以後未必。
我截取 #1DoEorL- (C_and_CPP) 這段文章 裡的一段 code
t1 = clock(), cnt=PrimeCnt(N), t2 = clock();
printf("cnt=%d, td=%d\n", cnt,t2-t1);
雖我已有加輸出動作,最後我實測結果還是會失敗,另一位版神出手
推
05/10 15:54,
05/10 15:54
這加上去後, 會影響 compiler 優化結果, 所以後來我另劈出路。
最後我包成 function pointer , 再以 function pointer 間接呼叫 test function
奇妙的事情是這問題解決了。
------------------
4. 記得詳細註明你的開發環境
因為我相關背景知識弱,所以在做測時開發時會測好幾次,
compiler 我會測過 Dev-C、Visual C++,
同一台電腦,這二個 compile 出來的執行檔,執行結果會讓人意外,
結果確實也關係到 Dev-C、Visual C++ 優化怎麼開。
CPU 我本身是 AMD,換到 Intel 後結果又不一樣,
不只是時間上增加/縮短,而是方法的快慢 order 整個都不一樣。
這樣一份程式碼前前後後就測了 4 次,
( 後來才「聽說」,一般測試基本上是以 Intel CPU 為主,沒驗證這件事)
不同 cpu、不同 compiler、不同優化,function 的 rank 就可能會有所不同。
--------------------
以上一點經驗, 供參考。
--
YouLoveMe() ? LetItBe() : LetMeFree();
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 180.177.78.41
※ 編輯: tropical72 來自: 180.177.78.41 (07/20 14:30)
推
07/20 14:31, , 1F
07/20 14:31, 1F
推
07/20 15:07, , 2F
07/20 15:07, 2F
→
07/20 15:07, , 3F
07/20 15:07, 3F
推
07/20 15:27, , 4F
07/20 15:27, 4F
→
07/20 15:28, , 5F
07/20 15:28, 5F
推
07/20 17:20, , 6F
07/20 17:20, 6F
→
07/20 17:21, , 7F
07/20 17:21, 7F
→
07/20 17:21, , 8F
07/20 17:21, 8F
→
07/20 17:21, , 9F
07/20 17:21, 9F
→
07/20 17:22, , 10F
07/20 17:22, 10F
→
07/20 17:28, , 11F
07/20 17:28, 11F
推
07/20 17:30, , 12F
07/20 17:30, 12F
→
07/20 17:30, , 13F
07/20 17:30, 13F
→
07/20 18:11, , 14F
07/20 18:11, 14F
推
07/20 18:51, , 15F
07/20 18:51, 15F
→
07/20 18:51, , 16F
07/20 18:51, 16F
→
07/20 18:53, , 17F
07/20 18:53, 17F
→
07/20 19:15, , 18F
07/20 19:15, 18F
→
07/20 20:05, , 19F
07/20 20:05, 19F
→
07/20 20:32, , 20F
07/20 20:32, 20F
→
07/20 20:51, , 21F
07/20 20:51, 21F
→
07/20 21:23, , 22F
07/20 21:23, 22F
→
07/20 22:31, , 23F
07/20 22:31, 23F
→
07/20 22:31, , 24F
07/20 22:31, 24F
推
07/21 06:25, , 25F
07/21 06:25, 25F
→
07/21 06:25, , 26F
07/21 06:25, 26F
→
07/21 07:30, , 27F
07/21 07:30, 27F
→
07/21 07:31, , 28F
07/21 07:31, 28F
→
07/21 10:47, , 29F
07/21 10:47, 29F
推
07/21 19:25, , 30F
07/21 19:25, 30F
→
07/21 19:27, , 31F
07/21 19:27, 31F
→
07/21 19:28, , 32F
07/21 19:28, 32F
討論串 (同標題文章)
完整討論串 (本文為第 2 之 2 篇):