编辑:代码是根据给我的建议修改的。
以下代码的目的是测量简单操作(1 + 1)的执行时间以及对不执行任何操作的函数(foo)的调用。
代码编译和seeme工作正常,但我得到的结果很奇怪 - 似乎基本操作需要与函数调用大致相同的时间,并且大多数情况下需要更多的时间
另一个问题是执行时间似乎不受影响的数量影响 - 它可能是100K或100M,但时间基本相同。此外,如果我选择一个超过十亿的数字,那么看起来执行时间会减少。
我无法在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;
}
答案 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 。它通常(并且应该)由您的编译器支持。