2012-03-04 8 views
2

手続き型プログラミングでは、複雑なコードをメンテナンスするために機能的分解が理想的です。しかし、関数は高価です - 呼び出しスタックに追加し、パラメータを渡し、戻りアドレスを格納します。このすべてに余分な時間がかかります!スピードが重要な場合は、どうすれば両方の世界のベストを得ることができますか?関数呼び出しで必要なオーバーヘッドがなくても、非常に分解されたプログラムが必要です。私は「インライン」というキーワードに精通していますが、それはコンパイラにとっての示唆に過ぎないと思われます。プログラマが誤って使用すると、さらに遅いプログラムが生成されます。私はg ++を使用していますので、-03フラグは機能を呼び出す関数を呼び出す関数を最適化します。 私の懸念が有効で、この問題に対処する方法があるかどうかを知りたかっただけです。機能を回避してプログラムの速度を向上させますか? (C++)

+0

[LinuxでC++コードをプロファイルするにはどうすればよいですか?](http://stackoverflow.com/questions/375913/what-c​​an-i-use-to-profile-c-code-in- linux) –

+2

通常、それについて心配しないでください。 'inline'キーワードを使用しなくても、良いコンパイラができる限りインラインでインライン展開されます。 –

+6

あなたの懸念事項は**有効ではありません**。 (1)どういうわけか、あなたがその状況にいるとは思わない、(2)その人が推測と伝聞によって遠くに得られない、ということです。 – delnan

答えて

3

まず、パフォーマンスの問題を扱う際には常に、プロファイラを使用してボトルネックを調べてみる必要があります。最初に出てくるのは、通常、関数呼び出しではなく、大きなマージンです。あなたがこれをしたなら、次に読んでください。

次に、inlineキーワードを使用して、インライン化する機能を少し期待することができます。コンパイラは通常インラインにするものとインラインにしないものを知るのに十分なほどスマートです(忘れてしまった関数をインライン展開することができ、助けにならないと思ったらインライン展開できないかもしれません)。

関数呼び出しのパフォーマンスを向上させ、インライン展開を実行したい場合は、コンパイラによってはこれを行うことができます(questionを参照)。大規模なインライン展開が実際にパフォーマンスを低下させる可能性があることを考慮してください。コードで多くのメモリが使用され、コードのキャッシュミスが以前よりも多くなることがあります。

-1

私はスピードがそれほど重要ではないと思っていますが、私の提案はプリプロセッサマクロを使用することです。例えば

#define max(a,b) (a > b ? a : b) 

これは私には明白なように見えるだろうが、私は自分自身C++には期待して考えていないので、私は質問を誤解している可能性があります。

+4

(1)マクロはC++では慣用的ではなく、テンプレートはすべての点でより効率的であり、効率的であり、スコープを尊重します。 (2)他の回答(ここや他の箇所)で説明されているように、たくさんのものをインライン展開するだけでは、パフォーマンスを改善する可能性はあまりありません。 – delnan

1

あなたが心配している特定のコードであれば、自分で時間を測定できます。それをループで大量に実行し、前後のシステム時間を取得するだけです。その差を使って各通話の平均時間を求めます。

あなたのシステムとコンパイラによって異なるため、いつもの数字は主観的です。異なるメソッドから取得した時間を比較して、関数をマクロで置き換えるなど、一般的に高速なものを確認することができます。私の推測では、多くの違いに気付かないでしょう、または少なくともそれは重要ではないでしょう。

スローダウンがJ.Nのアドバイスに従っているかわからない場合は、コードプロファイラを使用して、必要な場所を最適化してください。経験則として、参照やconst参照によって大型オブジェクトを関数に渡すと、コピー時間を避けることができます。

関連する問題