0

演算子がオーバーロードされた単純な数学ベクトル クラスがあります。オペレーターのタイミング結果を取得したいと考えています。次のコードのタイミングをとることで、+=、-=、*=、および /= の時間を簡単に計ることができます。

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

次に、反復乱数ベクトルを生成するのにかかる時間を差し引くことができます。私のテストでは、Vector は 3 次元、iter = 10,000,000 です。

+、-、*、/で同様のことを試みました:

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

次に、反復ランダムベクトルを生成して反復割り当てを実行するのにかかる時間を差し引きますが、これは「負の」時間を与え、コンパイラが何らかの形で操作を最適化しているか、何か奇妙なことが起こっていると信じさせます。

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 割り当て操作にかかった時間です。

私の質問は、割り当てやランダムなベクトル生成ではなく、演算子 + 関数だけの正確なタイミングを取得する方法です。

4

3 に答える 3

0

s のベクトルを作成し、RandVector()それらを反復するだけです。生成時間を測定する問題を解決します。割り当てに関しては、コンパイラがどのように最適化するかにかかっていると思います。

于 2013-06-22T00:07:36.847 に答える
0

基本的なベンチマーク方法の 1 つは、次を使用すること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-22T00:00:22.710 に答える