2012-12-17 5 views
5

Mac上のC++でさまざまなソートアルゴリズムを示すプログラムを作成する。 qsortとqsort_bという2つのクイックソートの実装が見つかりました。qsort_bとqsort

最初のものは当然のことながら、昔ながらの、どこでも見られます。しかしqsort_bは関数ではなくブロックをとります。私のコードは以下の通りです:

ここで私は大きな違いがあり、その違いを引き起こしています。私の理解では、ブロックは並列処理のためのものであり、この場合、関数より高速ではありません。並列処理には何もありません。

EDIT:heapsort_b()、mergesort_b()、およびqsort_b()ルーチンは、_b接尾辞を持たない対応ルーチンと同じですが、比較コールバックは関数ポインタではなくブロックポインタであると考えられます。 (FROM BSD MAN PAGE

EDIT:スピードの違い。 DATAが1000000の場合、qsortは146832 nsで終了し、qsort_bは127391 nsで終了します。それは約10%速いと考えると比較的大きな違いです。

EDIT:さらに大きな整数配列を作成できるようにコードを編集しました。私の個人的な最大のテスト結果は、28136278(28s)対23870078(24s)の100000000の整数です。それは私にとってかなり大きな違いです。

+0

あなたは "大きなスピードの違い"を練ることができます –

+0

@KarthikT私は測定装置では分かりませんが、ナノ秒だと思います。 qsortでは146832、qsort_bでは127391です。DATAは1000000です。 –

+0

私はこれまでより大きいデータ、100000000の整数でテストしました。 28136278(28秒)対23870078(24秒)です。それは私にとってかなり大きな違いです。 –

答えて

3

目的-C Blockは、異なる種類の動物です。 MACRO(コンパイル前の置換)、inline functions(コンパイラ"関数呼び出しのオーバーヘッドを排除するために最善を尽くす")のように見えるかもしれませんが、全体の構造はこれらの構造よりはるかに異なります。

ブロックオブジェクト、さらに、スタックオブジェクトあります。スタック内に作成できるオブジェクト(少なくともトリックはありません)。

スタックに作成されたBlockオブジェクトの場合、コンパイラはすべてのローカル変数、ブロック変数、参照する読み書き変数のアドレス、ブロックの実行可能コードへのポインタを追加します。したがって、実行を開始する前でさえ、スタック操作なしですべてが計算の準備ができています。

したがって、最適化の問題ではなく、Blockの属性です。 の関数呼び出しオーバヘッドはありません。スタック変数のPUSHPOPです。

あなたの質問への答えとして

qsort()qsort_b()任意のアルゴリズムの違いはありませんが、精巧な構造、機能対ブロック。

2

私との最適化の違いのように見えます。 qsort_bでは、コンパイラはおそらく比較をインライン化しますが、qsortではそうではありません。違いは、比較ごとの関数呼び出しのオーバーヘッドです。

+0

あなたは正しいことが必要です。私が間違っているなら、この特定の状況ではブロックはインライン関数のようなものです。また、インライン関数は関数より高速と見なされます。 (http://stackoverflow.com/questions/4016061/why-is-inlining-considered-faster-than-a-function-call) –

+0

@ ShaneHsu私が読んだもの以外のこれらのブロックについては何も知らない今すぐhttp://en.wikipedia.org/wiki/Blocks_(C_language_extension)からコンパイラが生成するコードの種類についてはコメントできません。何が起こっているのかを実際に理解したい場合は、コンパイラのコマンドラインスイッチを追加して、両方のケースのasmソースファイルを生成し、比較してください。もう1つの実験では、最適化をオフにして両方のバージョンを試してから、最大値までクランクし、相対的なパフォーマンスにどのような影響があるかを確認することができます。 – hyde

+0

その後、実験を行います。ありがとう! –