我有一个简单的数学向量类,带有重载的运算符。我想为我的运算符获取一些计时结果。通过对以下代码进行计时,我可以轻松地计时我的+=、-=、*=和/=:
Vector sum;
for(size_t i = 0; i<iter; ++i)
sum += RandVector();
cout << sum << endl;然后我可以减去生成iter随机向量所需的时间。在我的测试中,Vector是3维的,iter = 10,000,000。
我试着用+,-,*,/做类似的事情:
Vector sum;
for(size_t i = 0; i<iter; ++i)
sum = sum + RandVector();
cout << sum << endl;然后减去生成iter随机向量和执行iter赋值所需的时间,然而这给出了一个“负”时间,这让我相信要么是编译器在以某种方式优化操作,要么是发生了一些奇怪的事情。
我使用的是在Fedora Linux机器上使用-O3的gcc-4.7.2。
下面是我的计时代码:
clock_t start, k = clock();
do start = clock();
while(start == k);
F()();
clock_t end = clock();
double time = double(end-start)/double(CLOCKS_PER_SEC);
cout << time - time_iter_rand_v - time_iter_ass;这里的F是一个执行上述代码的函数对象。time_iter_rand_v是创建热核实验堆随机向量所用的时间,time_iter_ass是热核实验堆分配操作所用的时间。
我的问题是,如何获得operator+函数的准确时间,而不是任何赋值或随机向量生成?
发布于 2013-06-22 08:02:22
当优化正在进行时,你真的无法获得这样的事情的准确时间。这是因为编译器具有移动代码的能力。
如果您将时间存储变量设置为易失性,则由于移动,它们相对于彼此的位置不会受到优化。但是,它们周围的代码是,除非它们赋值或调用接受易失性变量的函数(这包括一个使*this易失性的易失性成员函数)。
如果你想要线性执行,优化可以对代码做很多奇怪的事情。
发布于 2013-06-22 08:00:23
一种基本的基准测试方法是使用gettimeofday:
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <sys/types.h>
#include <cstring>
//------------------- Handle time in milliseconds ----------------------//
/*
* Return 1 if the difference is negative, otherwise 0.
*/
int timeval_subtract(struct timeval *result, struct timeval *t2, struct timeval *t1)
{
long int diff = (t2->tv_usec + 1000000 * t2->tv_sec) - (t1->tv_usec + 1000000 * t1->tv_sec);
result->tv_sec = diff / 1000000;
result->tv_usec = diff % 1000000;
return (diff<0);
}
void timeval_print(struct timeval *tv)
{
char buffer[30];
time_t curtime;
printf("%ld.%06ld", tv->tv_sec, tv->tv_usec);
curtime = tv->tv_sec;
strftime(buffer, 30, "%m-%d-%Y %T", localtime(&curtime));
printf(" = %s.%06ld\n", buffer, tv->tv_usec);
}
// usage :
/*
struct timeval tvBegin, tvEnd, tvDiff;
// begin
gettimeofday(&tvBegin, NULL);
// lengthy operation
int i,j;
for(i=0;i<999999L;++i) {
j=sqrt(i);
}
//end
gettimeofday(&tvEnd, NULL);
// diff
timeval_subtract(&tvDiff, &tvEnd, &tvBegin);
printf("%ld.%06ld\n", tvDiff.tv_sec, tvDiff.tv_usec);
*/发布于 2013-06-22 08:07:37
只需创建一个RandVector()的向量并遍历它们。它将解决测量生成时间的问题。至于赋值,我认为这归结于编译器如何优化它。
https://stackoverflow.com/questions/17245899
复制相似问题