2013-06-21 343 views
0

我有一个运算符重载的简单数学矢量类。我想为我的运营商获得一些计时结果。我可以很容易地时候我+ =, - =,* =,和通过定时下面的代码/ =:定时运算符+,运算符,运算符*和运算符/

Vector sum; 
for(size_t i = 0; i<iter; ++i) 
    sum += RandVector(); 
cout << sum << endl; 

然后我可以减去它采用的用以产生ITER随机向量的时间。在我的测试中,Vector是三维的,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是创建iter随机向量所需的时间,time_iter_ass是iter分配操作所用的时间。

我的问题是如何获得只是运算符+函数的准确时间而不是任何赋值或随机向量生成?

+0

你好吗? – Gian

+0

我使用的时钟()从 pippin1289

+3

编译器不能使时钟倒退,可以吗?显然你的*时间码*是错误的。 – EJP

回答

1

你真的不能得到准确的计时类似的东西,当优化上。原因是编译器有能力移动代码。

如果您使存储变量的时间不稳定,它们相对于彼此的位置不会因移动而进行优化。但是,它们周围的代码是,除非它们正在分配或调用带有易失性变量的函数(这包括易失性成员函数,使得易失性成分*this)。

如果您期待线性执行,优化可以对代码做很多奇怪的事情。

0

一个基本标杆的方法是使用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); 


*/ 
0

只需创建一个向量RandVector() s并遍历它们。它将解决测量生成时间的问题。 至于分配,我认为这归结于编译器如何优化它。