2011-02-03 9 views
11

私は作業しているプログラムをテストしています。-gでコンパイルすると3μs(統計的に有意な変化)速く実行されています。これは私には意味がありません - 私は、-gフラグがプログラムの実行に影響を及ぼさないと考えていました。gcc -gデバッグフラグはプログラムの実行に影響しますか?

これはなぜ起こっているのですか?そして、それがプログラムの実行フローを変更するかどうか? -Oとコンパイルしていないのは、書かれたとおりに実行する必要があるからですが、-gが命令の順序を変更するとどうにかしてより速く実行できるかどうかは、明らかにそれを使用する必要があります。

ですから、-gフラグがどのような変更をプログラムに加えるのかを正確に知る必要があります。

編集:実行するテストが多いほど、t値が大きくなる(統計的に有意な差が生じる)。これは間違いなく測定エラーではありません - 何かが起こっています。

+0

また、-gを指定するとプログラムの実行速度が向上しますが、デフォルトではオンになるため、プログラムを特別なものにすることがありますか? – Benubird

+5

3usは実際に統計的に有意な変化ですか?システムクロックが正確な速度に近づいています。ランダムノイズ以外のものがあれば、私は驚くでしょう。 – templatetypedef

+0

です。各バージョンの1000以上のテストでは、t統計値は40 d.f。で1.8です。それは約95%重要です。 – Benubird

答えて

10

他の人は言っているように、デバッギングシンボルは、コンパイラに(おそらくない)バグがない限り、コードの制御フローを変更しません。

実行ファイルが大きくなり、実行されたコードがより多くのページに広がっているため、実行が変更されます。より多くのキャッシュミスとIO信号を期待できます。マルチタスク環境(さらにはLinux /ビジーボックスシステムなど)でも、スケジューリング動作がわずかに異なる場合があります。

一方、あなたがそれらを記述するような小さな時間差を測定することは、それ自身の権利の芸術です。おそらくHeisenbergの設定で、測定値が実行時間に影響します。あなたの測定値は統計的に有意な偏差を示すかもしれませんが、私はそのようなオプションがより速いコードを作ると言って解釈することに非常に注意するでしょう。

+0

それは理にかなっています。しかし、ミスをキャッシュしないと、実行は遅くなく高速になります。 – Benubird

+0

@Benubird:まず測定の混乱を招く。 –

+0

@Jens申し訳ありませんが、私はまだフォローしません。どのようにキャッシュミスが実行時間を短縮できますか? – Benubird

7

-gフラグは、実際に生成されたコードに0を加えます。これは、デバッグセクションを実行可能ファイルに追加することです。これらのセクションは実行時にロードされませんが、デバッガはロードできます。実行可能ファイルは今や少し違っているので、それは大きくなります。あなたはtne noを測定しようとするかもしれません。 1つのバージョンと別のバージョンのページ違反が発生すると、実行ファイルがディスクに保存される方法に変更がありますが、コードは変更されません。

あなたは私が確実3usを測定し、しかし3us増加の妥当性を疑問視ん、アセンブリを参照してください、あなたのバイナリに-dをobjdumpを実行し、

を比較したい場合は、少なくとも汎用OS上では難しいです課題 - このような測定に影響を及ぼすすべてのランダムな事柄を排除しようとするためには、あなたのプログラムを数千回(むしろ数十万回)実行してその数を思いつきたいと思います。

+0

私は実際に汎用OS上で実行していません。専用のビジーボックスシステム上にあります。これは、ptpd、cron、ssh、およびこれを実行するだけです。タイミングはかなり正確ですが、実行に約1分かかるため、残念ながら何十万回も実行する時間がありません。 – Benubird

1

サブルーチンの1つで-debugと-gフラグを使用すると、私のコードで別の回答が得られます。理由はわかりませんが、プログラムの実行には間違いありません。

+0

これは質問への回答を提供しません。投稿者の批判や説明を求めるには、投稿の下にコメントを残してください。 – osyan

+3

あなたが特定のカルマ閾値以下であるとコメントすることはできません(私は信じています) – Michael

関連する問題