gpt4 book ai didi

C++测量执行时间

转载 作者:行者123 更新时间:2023-11-28 05:49:22 25 4
gpt4 key购买 nike

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

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

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

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

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

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

指令时间纳米秒:1.9

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

最佳答案

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

如果你这样做:

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

你会得到更真实的结果

关于C++测量执行时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35576164/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com