【发布时间】:2016-02-23 11:20:17
【问题描述】:
编辑:根据给我的建议修改了代码。
以下代码的目的是测量一个简单操作 (1+1) 的执行时间和对一个什么都不做的函数 (foo) 的调用。
代码编译并且看起来工作正常,但我得到的结果很奇怪 - 似乎基本操作需要与函数调用大致相同的时间,而且大多数时候甚至需要更多时间.
另一个问题是执行时间似乎不受迭代次数的影响 - 它可能是 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