0

大規模なデータを並べ替える関数を作成しました。そのパフォーマンスをテストするために、私はそれをと比較しましたqsort。FreeBSDとGCC4.2.2を実行しているデスクトップでコンパイルするとqsort、関数よりも時間がかからなくなります。ただし、GCC 4.1.2でRedHatを実行しているサーバーでコンパイルした結果、関数の所要時間は。よりも短くなりましたqsort

私の機能がより良いかどうかについて私は混乱してqsortいます。誰かが私がこの奇妙な状況を説明するのを手伝ってもらえますか?

私は同じCFLAGSを使用して何度もテストし、同じマシンで、異なる機能を除いて他のすべての同じ条件で実行しました。

私のコード:

 53 int
 54 main(void)
 55 {
 56     int * array_first, * array_next;
 57     int len = 1000000;
 58     int i;
 59     struct timeval start, duration;
 60 
 61 
 62 
 63     array_first = malloc(sizeof(int) * len);
 64     array_next = malloc(sizeof(int) * len);
 65 
 66 
 67     for(i = 0; i < len; i++){
 68         *(array_first + i) = rand() % 1000;
 69         *(array_next + i) = *(array_first + i);
 70     }
 71 
 72     set_starttime(&start);
 73     quicksort(array_first, len, sizeof(int), compar);
 74     get_runningtime(start, &duration);
 75     printf("%lu\n", duration.tv_sec * MICRO_PER_SEC + duration.tv_usec);
 76     set_starttime(&start);
 77     qsort(array_next, len, sizeof(int), compar);
 78     get_runningtime(start, &duration);
 79     printf("%lu\n", duration.tv_sec * MICRO_PER_SEC + duration.tv_usec);
 80 
 81     assert(memcmp(array_first, array_next, sizeof(int) * len) == 0);
 82 
 83     free(array_first);
 84     free(array_next);
 85 
 86     return 0;
 87 }
 88 
4

3 に答える 3

1

パフォーマンスが異なる理由はたくさんあります。

  • の実装はqsort2つのシステムで異なる可能性があり、1つはたまたまテストケースに適しています
  • テストケースがランダムに生成された場合、1つのテストケースで運が悪かった可能性があります
  • 異なるコンパイラバージョンでコードをコンパイルすることは、コードのパフォーマンスを変更するさまざまな最適化が行われることを意味します
  • 異なるシステムでテストを実行するということは、同じコードで異なるパフォーマンスが発生することを意味します。特定のテストケースを備えた1つのアーキテクチャでは、キャッシュがわずかに誤用される可能性がありますが、より大きなキャッシュを備えた別のアーキテクチャでは、これは問題になりません。

私は他に1億の理由を考えることができますが、これはあなたがそのような比較を試みるべきではないことをあなたに知らせるのに十分なはずです。

于 2012-07-04T12:21:16.140 に答える
0

compar()関数をインライン化できる(静的関数をインライン化できる)場合、それは大きなメリットになります。インライン化の量は、コンパイラとフラグに大きく依存します。

qsort()の場合、インライン化は使用できません。qsortは、真の関数であるコールバック関数に依存します。通常、比較関数は、安価な比較関数の場合でも(呼び出しのオーバーヘッドが比較的大きい場合)、プロファイル内のCPUのxx%を消費しているように見えます。(プロファイリングしましたか?)

于 2012-07-04T12:55:53.493 に答える
0

両方のコンピューターで同じデータを使用し、同時に実行されている他のプログラムがテスト結果を歪めないようにしたと思います。

まず、生成されたアセンブリコードを確認し、両方のコンパイラバージョンが同じ出力を生成するかどうかを確認できます。

もしそうなら、違いはおそらく2台のコンピュータの異なるハードウェアアーキテクチャ、主にCPUとそのキャッシュによって引き起こされます。

大きなL2/L3キャッシュを備えたCPUで実行すると、1つの実装は高速になる可能性がありますが、使用可能なスペースが少ない場合は、はるかに低速になります。

于 2012-07-04T12:18:23.950 に答える