【问题标题】:c++ measuring execution timec ++测量执行时间
【发布时间】:2016-02-23 11:20:17
【问题描述】:

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

以下代码的目的是测量一个简单操作 (1+1) 的执行时间和对一个什么都不做的函数 (foo) 的调用。

  1. 代码编译并且看起来工作正常,但我得到的结果很奇怪 - 似乎基本操作需要与函数调用大致相同的时间,而且大多数时候甚至需要更多时间.

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

我在谷歌上找不到我需要的东西 - 我必须对一个简单的操作和一个空函数计时,它应该与 measureTimes() 位于同一个文件中,或者至少 - 每个测量函数都应该完全包含在一个单个文件(此外,到目前为止,将 foo() 移动到另一个文件实际上减少了时间

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

指令时间纳米秒: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;
}

【问题讨论】:

  • 另一个带有 C++ 流的 C ......无论如何,发布你的编译器标志,因为你的大部分代码可能无论如何都会被优化。
  • 我会检查汇编程序的输出,看看你想要计时的那些调用是否存在。
  • 你是怎么知道的?我的代码编译成功
  • 即使优化器已关闭 (-O0),您仍假设 1+1 会花费时间,但 for 循环不会。如果要测量循环内的内容,则必须将循环展开一段距离,例如 10 或 100 次。
  • 您尝试测量的内容实际上无法通过该方法进行测量。 1+1; 不会转换为任何代码,调用空函数的循环几乎肯定会被优化掉。你真的应该设计一个更好的性能测试,一个真正做某事的测试,以获得可衡量的结果。

标签: c++ performance benchmarking


【解决方案1】:

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

如果你这样做:

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

你会得到更真实的结果

【讨论】:

  • 取决于优化级别。编译器现在很聪明,可以优化很多东西。
  • 什么是x?如果您在循环内声明一个变量并且不再使用它,编译器肯定会优化它。不需要聪明。您需要做的是在循环外声明一个volatile 变量,然后每次递增。这将迫使优化器不理会它。
  • @CodyGray 我的意思是在 for 循环之外声明 x 并将该代码放入其中,最后将其输出给用户。我只是放了简化版
  • x=x+1 是否等于 1+1?我必须测量一个基本操作。
  • @proton: 1+1 是编译器已知的,这会导致 2 并且当它没有分配给其他任何东西时,它变得多余,编译器将删除整个代码以进行优化。但是,x=x+1 在编译时是未知的,所以编译器不会处理它
【解决方案2】:

您总是在计算平均值。对于迭代次数,这应该或多或少相同

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

【讨论】:

  • 我没有检查你新编辑的代码,但是当你测量时间时,你将花费的时间除以迭代次数,所以无论你增加迭代次数,平均值都会更多或不太一样。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2011-04-23
    • 2015-07-25
    • 1970-01-01
    • 2013-03-28
    • 1970-01-01
    • 2013-03-21
    • 2016-06-15
    • 2022-01-03
    相关资源
    最近更新 更多