2012-04-14 6 views
6

これは「アルゴリズム」ですが、実行時間を測定したいときはゼロになります。どうして?C時間を正しく測定する方法は?

#define ARRAY_SIZE 10000 
... 

clock_t start, end; 

start = clock(); 

for(i = 0; i < ARRAY_SIZE; i++) 
{ 
non_parallel[i] = vec[i] * vec[i]; 
} 
end = clock(); 
printf("Number of seconds: %f\n", (end-start)/(double)CLOCKS_PER_SEC); 

だから私は時間を測定する必要がありますか?

答えて

14

2つのことを参照してください。

  1. 10000は、現代のコンピュータ上の多くではありません。したがってループはおそらくミリ秒未満で実行され、精度はclock()よりも小さくなります。したがって、ゼロを返します。

  2. non_parallelの結果を使用していない場合は、ループ全体がコンパイラによって最適化される可能性があります。

おそらく、より高価なループが必要です。 ARRAY_SIZEをもっと大きなものに増やしてみてください。


ここで大きな配列サイズと私のマシンでのテストです:

#define ARRAY_SIZE 100000000 

int main(){ 

    clock_t start, end; 

    double *non_parallel = (double*)malloc(ARRAY_SIZE * sizeof(double)); 
    double *vec   = (double*)malloc(ARRAY_SIZE * sizeof(double)); 

    start = clock(); 

    for(int i = 0; i < ARRAY_SIZE; i++) 
    { 
     non_parallel[i] = vec[i] * vec[i]; 
    } 

    end = clock(); 
    printf("Number of seconds: %f\n", (end-start)/(double)CLOCKS_PER_SEC); 


    free(non_parallel); 
    free(vec); 
    return 0; 
} 

出力:

Number of seconds: 0.446000 
5

clock()関数の精度が非常に低く、ループが多くの作業をしていないため、これは秒数を実際に計測する信頼性のない方法です。ループをより長く実行するようにするか、より良いタイミング方法を使用することができます。

より精度の高い方法は、プラットフォーム固有です。 Windowsの場合、How to use QueryPerformanceCounter?を参照し、Linux用High resolution timer with C++ and Linux?

+3

なしあの、OPはすでにオペランドの一方を落としています「倍増」する。 – Mysticial

+0

@ミスティカル私の部分で失敗し、私の答えを固定しました。 – jli

+0

次に、高性能カウンタに言及するために+1することができます。 – Mysticial

関連する問題