2016-02-23 41 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。它通常是(也应该)被你的编译器支持。