2010-12-27 7 views
0

私は、何回も繰り返す一連の計算でできるだけ多くの時間を節約しようとしています。計算には、変数S = 1が1でない場合と2つの場合があります。変数Sは、コードの冒頭に#defineの定数として設定されています。対if #if:高速なパフォーマンスですか?

今のところ、私はifを持っています。適切な計算を行う前に、Sの値を確認してください。 #ifを代わりに使用するとパフォーマンスが向上しますが、プリプロセッサーには事前に使用されるコードの一部が選択されていますか?Sはすでに利用可能ですので、私は過労の増加は見られませんが、これは間違いなく道のりであると言われています。

実際のコードの途中でプリプロセッサコードを使用するのは変わっていますが、実際に役立つ場合は問題はありません。このような場合には#ifを使用していますか?

+7

いつものように、2つ以上の選択肢の間のパフォーマンスについて質問がある場合は、*測定してください*! –

+0

@Greg:確かですが、常識的には、(1)とにかく問題ではない可能性があり、(2)とにかく差異がゼロになることを示すのに十分な場合があります。 - 本当に些細な/考案されたもの、ここでいつも尋ねられるものもあります。 – delnan

+0

@Greg:それは特定の問題に対する良い答えですが、この質問に対する一般的な答えを知ることはずっと便利です。パフォーマンスが同じであることが一般的に分かっている場合は、パフォーマンスを無駄にしてしまう心配なしに、コード内のフォームが自由に選択できます。同様に、 '* 2'と' '1''が常に同じコードを生成することを知ることは有益です。読みやすい(またはより良い演算子優先プロパティがある)ときに' * 2'を使うことができます。 –

答えて

5

ifの中に副作用のない定数式がある場合は、合理的なコンパイラが計算を気にしないコードを生成すると思います。だから私は違いはないと思うだろう。コンパイラのアセンブリ出力を確認して確認することができます。

#ifを使用することが理にかなっていると思う唯一の状況は、ある特定のブロックが特定の構成に対して全く意味をなさない(またはコンパイルされない)場合です。私はそれが他のもののために奇妙に見えることに同意するでしょう。一方、常にtrueまたはalways-falseのいずれかであるifのステートメントを持つことは、私にとってはちょっと変です。しかし、これは主観的な呼び出しです。

0

あなたのコンパイラが何か良いことがあれば、おそらく何の違いも見られません。まともなオプティマイザは、あなたが定数をチェックしていることを確認し、実際にそのチェックのためのコードを生成しません。

私はあなたにあなた(ほとんどの場合BS)の最適化リクエストを投げかけてくれることを心配しています。 That way lies the road to Hell。あなたがパフォーマンスを向上させるために余分なプログラマー時間を大量に投資する価値が非常に重要であると考える人は正しい方法はルーチンをプロファイルすることです。コードの読み込みを困難にすると思われる最適化については、パフォーマンスを改善してその価値があることを証明するために再構築する必要があります。

また、Cでは回避が難しいかもしれませんが、一般的にはプリプロセッサを避けるようにしてください。実装の仕組みは通常のコンパイルされたコードと大きく異なるので、ソースを理解しにくくする傾向があります。あなたの反復時間の3ナノ秒を節約しないことは知っていますが、それは数週間のメンテナンスプログラマー時間を節約することができます。それも安いわけではない。

0

まあ、プリプロセッサはそれをカットしてバイナリにコンパイルされないので、不要なコードは削除されますが、実際にバイナリサイズまたはCPUサイクル(すなわち、マイクロプロセッサまたは内蔵デバイス上)である。通常のデスクトップアプリケーションでは?それは傷つけることはありませんが、実際にはコード内でジャンプ文が1つだけであるため、実際には違いはありません。

-1

プリプロセッサーは#if指示文を処理します。つまり、出力コードには必要な行が1つだけ含まれます。これにより、コンパイル時間は長くなりますが、最適な実行時間になります。

一方、ifキーワードを使用すると、出力マシンコードに分岐命令が配置されます。これは、アセンブリで分岐命令がゼロよりも実行に時間がかかります。

"if"を複数回実行している場合は、#if指示文を使用することで、より多くのサイクルを大幅に節約できます。

しかし、これまでの回答で言及したように、コンパイラはこれを最適化する可能性が非常に高いです。

+0

これを最適化しない(この場合はパフォーマンスについては気にしないので、 '-O0'を省略して)*最適化しないコンパイラを見つけるのは難しいでしょう。 – delnan

+0

'-O0'であっても、実際に条件をテストするのではないかと疑います。不可能な場合には無条件にジャンプするだけでしょう。 –

関連する問題