[問題] 執行時間的問題

看板C_and_CPP作者 (剛好而已)時間14年前 (2011/08/22 21:04), 編輯推噓6(6021)
留言27則, 9人參與, 最新討論串1/2 (看更多)
想要計算一個程式中執行某個function所需的時間 使用了 clock 和 GetTickCount 結果都是0.000000 在計時結束之後,我分別印出t1和t2來監視 發現都是同樣時間,所以結果當然會是0.000000 那個function只有傳入2個參數 從一個array中的2個參數位置取出值 然後回傳相減值 是因為執行時間太短嗎? 有想過用while包住讓他執行很多次,是可以出現差距 但是空迴圈本身好像也會有執行時間 這樣是不是就不準確了? 有什麼辦法可以測得這種小函式的時間嗎? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 123.0.34.42

08/22 21:31, , 1F
time_t time ( time_t * timer );<--
08/22 21:31, 1F

08/22 21:33, , 2F
double difftime ( time_t time2, time_t time1 );<--
08/22 21:33, 2F

08/22 21:33, , 3F
time_t不是計秒的嗎@@
08/22 21:33, 3F

08/22 21:35, , 4F
跑函數十萬次的時間 - 空迴圈十萬圈的時間
08/22 21:35, 4F
這方法我剛測試了一下,要用到1百萬才行,大概會在2個值之間跳動0.0155 0.0144 除以100萬這個差距應該可以忽略,想確認這方法是可靠的嗎?

08/22 21:37, , 5F
t大是專家
08/22 21:37, 5F

08/22 21:41, , 6F
VS O2 優化關掉就行了,原因在於O2會自動判斷哪些變數沒
08/22 21:41, 6F

08/22 21:42, , 7F
用到自動幫你砍掉。若堅持要開O2的話,最後再做個結果
08/22 21:42, 7F

08/22 21:42, , 8F
輸出(當然輸出時間不計時)即可。若是全都寫成 function
08/22 21:42, 8F

08/22 21:42, , 9F
樓上指的02是? 我是用CODEBLOCK
08/22 21:42, 9F

08/22 21:43, , 10F
那開O2 function 測時必為 0,解決方案是,
08/22 21:43, 10F

08/22 21:43, , 11F
包 function pointer.
08/22 21:43, 11F

08/22 21:43, , 12F
嗯, 我語意不清,意指,compiler 幫你都優化過了..
08/22 21:43, 12F

08/22 21:44, , 13F
最簡單方式是把 compiler 優化都關掉。
08/22 21:44, 13F
我是用codeblock 怎麼關優化?

08/22 21:44, , 14F
O2不是gnu的東西? 原po也有可能是用vs喔
08/22 21:44, 14F

08/22 21:44, , 15F
firejox 我都用計秒去算
08/22 21:44, 15F
※ 編輯: scott90213 來自: 123.0.34.42 (08/22 22:10)

08/22 22:11, , 16F
我發個文好了..
08/22 22:11, 16F
麻煩了

08/22 22:13, , 17F
期待
08/22 22:13, 17F
※ 編輯: scott90213 來自: 123.0.34.42 (08/22 22:28)

08/22 22:29, , 18F
如果是windows, 應該可以用QueryPerformanceCounter().
08/22 22:29, 18F
=============================================================== 其實我原本要解決的問題是 1.做出一個function可以輸入起、迄月份,就會得到共有幾日 2.計算function代入(1,6) 和 (1,12) 各要花多少時間 如何得知結果,請說明你的計算程序? 程式很簡單 但是第2部分我想了很久,題目這樣問似乎時間是可以直接算出來的樣子?? 出題者有說:科學家估算地球到太陽的距離,絕對找不到一把夠大的尺去量的 這個說明還是讓我摸不著頭緒... 且我如果不用for迴圈,而是使用存放累加值的Array回傳相減值 那1,6和1,12時間應該是一樣的吧? 我目前只能想到用clock這類的計時器來測量,但是即便測出結果 似乎也沒有辦法完整回答第2題,到底還有什麼方法? ※ 編輯: scott90213 來自: 123.0.34.42 (08/22 23:09)

08/22 23:13, , 19F
編譯器還有可能幫你改變程式的執行順序,「可能」可以用
08/22 23:13, 19F

08/22 23:18, , 20F
memory barrier 減少一點負擔...
08/22 23:18, 20F

08/22 23:19, , 21F

08/22 23:19, , 22F
總之在硬體和編譯器聯手之下,不要太相信你程式碼的順序:P
08/22 23:19, 22F

08/22 23:50, , 23F
Orz.. 我發文完後,看到補充,整個傻掉了,你的程式不
08/22 23:50, 23F

08/22 23:51, , 24F
非常適合用 wall time 分析,我推應是要考 asm code..
08/22 23:51, 24F

08/22 23:52, , 25F
若真是的話,我建議去 google 一下「程式之美」,裡面一
08/22 23:52, 25F

08/22 23:52, , 26F
題搞懂的話,這問題相信也難不倒你。
08/22 23:52, 26F

08/22 23:53, , 27F
http://0rz.tw/B3HNZ 參考一下 解法一 的分析
08/22 23:53, 27F
文章代碼(AID): #1EKbFMZ- (C_and_CPP)
文章代碼(AID): #1EKbFMZ- (C_and_CPP)