2016-02-23 40 views
0

編輯:代碼被修改後,對我的建議givven。C++測量執行時間

以下代碼的目的是測量簡單操作(1 + 1)的執行時間以及對不執行任何操作的函數(foo)的調用。

  1. 代碼編譯和SeeME所能夠正常工作,但我得到的結果是奇怪的 - 這似乎基本操作需要大約在同一時間的函數調用,而且大多數時候,它需要更多的哪怕是一點點時間。

  2. 另一個問題是執行時間似乎沒有受到數量的影響 - 它可能是100K或100M,但時間基本相同。另外,如果我選擇一個超過10億的數字,它會減少執行時間。

我不能對谷歌什麼,我需要找到 - 我一定時間的一個簡單opertaion和一個空的功能,這應該是在同一個文件measureTimes()是,或者至少 - 各測量功能應該是在一個文件中包含wholy(再說,現在的移動富()到另一個文件卻減少了時間,到目前爲止

,這是我的程序的輸出:

instructionTimeNanoSecond:1.9

functionTimeNanoSecond: 1.627

#include <iostream> 
    #include <unistd.h> 
    #include <string.h> 
    #include <sys/time.h> 
    #include <math.h> 

    #include "osm.h" 

    #define INVALID_ITERATIONS 0 
    #define DEFAULT_ITERATIONS 1000 
    #define HOST_NAME_LEN 100 
    #define TO_NANO 1000 
    #define TO_MICRO 1000000 
    #define ROLL 10 

    using namespace std; 

    int main() 
    { 
     unsigned int iterations = (unsigned int) pow(10, 9); 

     measureTimes(iterations, iterations, iterations, iterations); 

     return 0; 
    } 

    void foo(); 

    timeMeasurmentStructure measureTimes (unsigned int operation_iterations, 
              unsigned int function_iterations, 
    ) 
     { 

    double functionTimeNanoSecond; 

    functionTimeNanoSecond = osm_function_time(function_iterations); 
    cout << "functionTimeNanoSecond: " << functionTimeNanoSecond << "\n";; 

    double instructionTimeNanoSecond; 

    instructionTimeNanoSecond = osm_operation_time(operation_iterations); 
    cout << "instructionTimeNanoSecond: " << instructionTimeNanoSecond << "\n"; 





} 

    double osm_operation_time(unsigned int iterations) 
    { 
     timeval start; 
     gettimeofday(&start, NULL); 

    int x=0; 
    for(int i = 0; i < iterations/ROLL; i++) 
    { 
     x=x+1; 
     x=x+1; 
     x=x+1; 
     x=x+1; 
     x=x+1; 
     x=x+1; 
     x=x+1; 
     x=x+1; 
     x=x+1; 
     x=x+1; 
    } 

    timeval end; 
    gettimeofday(&end, NULL); 

    timeval diff; 
    timersub(&end, &start, &diff); 

    // double micro_seconds =(double) (end.tv_usec - start.tv_usec); 

    double ret =((double) diff.tv_sec*TO_MICRO + diff.tv_usec)/((double) iterations); 


    return ret * TO_NANO; 
} 

double osm_function_time(unsigned int iterations) 
{ 
    timeval start; 
    gettimeofday(&start, NULL); 

    for(int i = 0; i < iterations/ROLL; i++) 
    { 
     foo(); 
     foo(); 
     foo(); 
     foo(); 
     foo(); 
     foo(); 
     foo(); 
     foo(); 
     foo(); 
     foo(); 
    } 

    timeval end; 
    gettimeofday(&end, NULL); 

    timeval diff; 
    timersub(&end, &start, &diff); 

    //double micro_seconds = (double)((end.tv_sec - start.tv_sec)*TO_MICRO+(end.tv_usec - start.tv_usec)); 

    double ret =((double) diff.tv_sec*TO_MICRO + diff.tv_usec)/((double) iterations); 

    return ret * TO_NANO; 
} 

void foo() 
{ 
    return; 
} 
+1

另一個C與C++流...無論如何,發佈你的編譯器標誌,因爲你的代碼大部分可能會被優化出來。 – Zereges

+1

我會檢查彙編輸出,看看你想要的那些調用是否存在。 – iksemyonov

+0

你怎麼弄到的?我的代碼成功編譯 – proton

回答

1

在這種情況下,編譯器優化代碼,可能甚至不執行的循環,因爲裏面1+1的代碼不影響程序的其餘部分。

如果你做這樣的事情:

int x = 0; 
for(int i=0;i<iteration;i++) 
    x = x + 1; 
cout << x; 

你會得到更多實實在在的成效

+3

取決於最優化級別。編譯器現在很聰明,可以優化很多東西。 – Zereges

+0

什麼是'x'?如果你在循環中聲明瞭一個變量並且再也不使用它,那麼編譯器肯定會優化它。不需要智慧。你需要做的是在循環外聲明一個volatile變量,然後每次遞增。這將迫使優化器單獨放置它。 –

+0

@CodyGray我的意思是在for循環之外聲明x,並將該代碼放在裏面,並在最後輸出給用戶。我只是把簡化版 – Pooya

0

你總是計算平均值..這應該是或多或少的不重複

相同
double ret = diff.tv_usec/((double) iterations); 
+0

對不起,我不明白你的意思 – proton

+0

我沒有檢查你的新編輯的代碼,但是當你測量時間,你把與迭代的NR所花費的時間,所以,無論你增加迭代,平均會或多或少相同。 –

0

您正在查找的魔法詞是profiling。它通常是(也應該)被你的編譯器支持。