5

私のプログラムは、時間と空間の両方で、さまざまな並べ替えアルゴリズムを互いに競合させようとしています。スペースをカバーしましたが、時間を測定するのが面倒です。並べ替えを実行するコードは次のとおりです。

void test(short* n, short len) {
  short i, j, a[1024];

  for(i=0; i<2; i++) {         // Loop over each sort algo
    memused = 0;               // Initialize memory marker
    for(j=0; j<len; j++)       // Copy scrambled list into fresh array
      a[j] = n[j];             // (Sorting algos are in-place)
                               // ***Point A***
    switch(i) {                // Pick sorting algo
    case 0:
      selectionSort(a, len);
    case 1:
      quicksort(a, len);
    }
                               // ***Point B***    
    spc[i][len] = memused;     // Record how much mem was used
  }
}

(簡単にするために、ソートアルゴリズムの一部を削除しました)

ここで、並べ替えアルゴリズムにかかる時間を測定する必要があります。これを行う最も明白な方法は、ポイント (a) の時間を記録し、ポイント (b) の時間からそれを差し引くことです。しかし、C の時間関数はどれも十分ではありません。

time()は時間を秒単位で教えてくれますが、アルゴはそれよりも速いので、もっと正確なものが必要です。

clock()は、プログラムが開始されてからの CPU ティックを提供しますが、最も近い 10,000 に丸められているようです。まだ小さくない

timeシェル コマンドは十分に機能しますが、アルゴリズムごとに 1,000 以上のテストを実行する必要があり、それぞれのテストに個別の時間が必要です。

getrusage()が何を返すのかわかりませんが、長すぎます。

私が必要とするのは、並べ替え関数の実行時間よりも短い単位での時間です (可能であれば大幅に): 約 2 ミリ秒。私の質問は次のとおりです。どこで入手できますか?

4

4 に答える 4

13

gettimeofday()マイクロ秒の分解能があり、使いやすいです。

便利なタイマー関数のペアは次のとおりです。

static struct timeval tm1;

static inline void start()
{
    gettimeofday(&tm1, NULL);
}

static inline void stop()
{
    struct timeval tm2;
    gettimeofday(&tm2, NULL);

    unsigned long long t = 1000 * (tm2.tv_sec - tm1.tv_sec) + (tm2.tv_usec - tm1.tv_usec) / 1000;
    printf("%llu ms\n", t);
}
于 2013-05-26T22:29:31.533 に答える