定时运算符+,运算符 - 运算符*和运算符/

时间:2013-06-21 23:52:04

标签: c++ performance benchmarking

我有一个简单的数学向量类,运算符重载。我想为我的运营商获得一些时间结果。我可以通过计算以下代码轻松计算我的+ =, - =,* =和/ =:

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机器上使用-cc3使用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赋值操作所花费的时间。

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

3 个答案:

答案 0 :(得分:1)

当优化开启时,你真的无法获得类似的精确计时。原因是编译器能够移动代码。

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

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

答案 1 :(得分: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);


 */

答案 2 :(得分:0)

只需创建RandVector() s的向量并迭代它们。它将解决测量发电时间的问题。 至于作业,我认为它归结为编译器如何优化它。