2016-08-27 5 views
0

私は同じコードからclock()を複数回呼び出して、さまざまな操作の時間を計算しています。私は、これらのステップが後の操作のセットよりもおそらく速い場合でも、最初の操作のセットにはより多くの時間がかかることに気付きました。そこで、以下のサンプルコードに示すように、同じ一連の操作でテストしました。次の例では、セット1の場合0.001ms、セット2の場合〜0msを返しますが、セット1とセット2は同じオペレーションです。この動作の説明はありますか?ctime clock()は、同じプログラムで同じプログラムが2回呼び出されたときに、異なる時刻を返すのはなぜですか?

例コード:

1 #include <iostream> 
    2 #include <ctime> 
    3 
    4 using namespace std; 
    5 
    6 int main() 
    7 { 
    8  int x = 1000000; 
    9 
10  //Set 1: 
11  clock_t t0 = clock(); 
12  int y = x * x; 
13  y *= x; 
14  t0 = clock() - t0; 
15  
16  //Set 2: 
17  clock_t t1 = clock(); 
18  int z = x * x; 
19  z *= x; 
20  t1 = clock() - t1; 
21  
22  cout << "Set1 : " << (double)t0/CLOCKS_PER_SEC * 1000 << " ms." << endl; 
23  cout << "Set2 : " << (double)t1/CLOCKS_PER_SEC * 1000 << " ms." << endl; 
24  
25  return 0; 
26 } 
+2

clock()は、このような高速動作を確実に測定するのに十分に近いほどにはありません。 – Chris

+0

私が賭ける数千の操作の時間を平均した場合、彼らは等しいでしょう。 – sbooth

+0

ありがとう、しかし、私はそれを知っています。この例の高速動作を、何らかのより長い動作(例えば、100万個の数字のようなクイックソート)に置き換えます。それを2回呼ぶ。最初の通話にかかった時間が長くなりました! –

答えて

2

あなたはclock(3) manualページの最初の文で説明を見つける:

クロック()関数は、プログラムによって を使用したプロセッサ時間の近似値を返します。 。 "近似" の部分に

特別強調。

また、現代のCPUが、コード内のようないくつかの乗算命令を、1クロックの時間内に簡単に実行できることには役立ちません。ミックスCPUのキャッシュ、パイプライン、プリエンプティブなマルチタスキングを混ぜると、この種の測定はかなり無意味です。

関連する問題