c ++测量执行时间

时间:2016-02-23 11:20:18

标签: c++ performance benchmarking

编辑:代码是根据给我的建议修改的。

以下代码的目的是测量简单操作(1 + 1)的执行时间以及对不执行任何操作的函数(foo)的调用。

  1. 代码编译和seeme工作正常,但我得到的结果很奇怪 - 似乎基本操作需要与函数调用大致相同的时间,并且大多数情况下需要更多的时间

  2. 另一个问题是执行时间似乎不受影响的数量影响 - 它可能是100K或100M,但时间基本相同。此外,如果我选择一个超过十亿的数字,那么看起来执行时间会减少。

  3. 我无法在google上找到我需要的东西 - 我必须计算一个简单的opertaion和一个空函数,它应该与measureTimes()在同一个文件中,或者至少 - 每个测量函数应该包含在一个单个文件(此外,将foo()移动到另一个文件实际上减少了到目前为止的时间

    现在,这是我的程序的输出:

    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;
    }
    

3 个答案:

答案 0 :(得分:1)

在这种情况下,编译器正在优化您的代码,甚至可能甚至不执行for循环,因为1+1中的代码不会影响程序的其余部分。

如果您执行以下操作:

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

您将获得更多真实结果

答案 1 :(得分:0)

你总是在计算平均值..对于迭代次数,它应该或多或少相同

double ret = diff.tv_usec / ((double) iterations);

答案 2 :(得分:0)

您正在寻找的神奇词语是 profiling 。它通常(并且应该)由您的编译器支持。