2013-06-21 4 views
0

연산자가 오버로드 된 간단한 수학 벡터 클래스가 있습니다. 내 운영자를위한 타이밍 결과를 얻고 싶습니다.타이밍 연산자 +, 연산자 -, 연산자 * 및 연산자/

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는 반복 할당 작업에 걸린 시간입니다.

내 질문은 연산자 + 함수의 정확한 타이밍을 얻는 방법입니다. 할당이나 임의의 벡터 생성이 아닌가요?

+0

타이밍을 어떻게 지내십니까? – Gian

+0

clock()을 사용하고 있습니다 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()의 벡터를 만들고 반복합니다. 그것은 세대의 시간을 측정하는 문제를 해결할 것입니다. 할당에 대해서는 컴파일러가 최적화하는 방법에 달려 있다고 생각합니다.