2011-03-31 37 views
2

爲什麼執行函數f1()的時間在調試模式下會從一次運行變爲另一次運行?爲什麼它在發佈模式下始終爲零?關於clock()函數的問題

我沒有包括stdio.h也沒有cstdio和代碼編譯。怎麼樣 ?

#include <iostream> 
#include <ctime> 

void f1() 
{ 
    for(int i = 0; i < 10000; i++); 
} 

int main() 
{ 
    clock_t start, finish; 

    start = clock(); 
    for(int i = 0; i < 100000; i++) f1(); 
    finish = clock(); 

    double duration = (double)(finish - start)/CLOCKS_PER_SEC; 

    printf("Duration = %6.2f seconds\n", duration); 
} 

回答

0

我相信在發佈模式下看到零運行時的原因是因爲編譯器正在優化函數。由於您的for循環沒有代碼塊,因此可以在編譯期間有效地將其拉出。

我猜這個優化不是在調試模式下執行的,這可以解釋爲什麼你會看到更長的執行時間。它只是因爲你的操作系統調度程序(幾乎可以肯定)不能保證進程的固定時隙而在運行之間變化。

至於爲什麼你可以使用printf(),當你沒有明確包含<cstdio>時,這是因爲包括<iostream>

Ç尋找我的頭:\ Program Files文件\微軟的Visual Studio 10.0 \ VC \包括,我可以看到的iostream包括istream的的ostream,兩者包括IOS,其中包括xlocnum,其中包括cstdlibcstdio

+0

我改變了函數f1()來計算前10000個整數的和並返回這個值。釋放模式對於執行時間仍然返回0。 – Ayrosa 2011-03-31 11:00:28

+0

我終於找到了釋放模式下的執行時間大於0的情況。 – Ayrosa 2011-03-31 13:49:34

+0

@jaayrosa,我不確定我對編譯器優化的假設是否正確,但很可能是空循環。如果您仍然看到循環中有指令的0運行時,則可能還有其他事情正在發生(請參閱hopia的答案)。 – Rob 2011-03-31 16:09:59

1

可能您運行測試代碼的機器速度太快。嘗試增加循環次數到一個非常巨大的數字。

要嘗試的其他事情是使用sleep()函數進行測試。 這應該確認你的clock()測量的行爲。

+0

任何機會,你可以做一個小的編輯?我錯過了關於使用'sleep()'測試的評論,我想改變我的投票。抱歉。 – Rob 2011-03-31 16:14:39

+1

沒有問題。我想提供一些關於如何確定他的時鐘()是否正常工作的調試技巧。但是,是的,我同意優化可能會將該循環轉化爲無所事事。 – hopia 2011-04-01 01:20:05