2010-11-25 10 views
1

は、コードのこの部分を考えてみましょう:私は行くことができます今すぐ実行時に違いはありますか?


class A { 
    void methodX() { 
    // snip (1 liner function) 
    } 
} 

class B { 
    void methodX() { 
    // same -code 
    } 
} 

他の方法は、私は、そのメンバーのほとんどが静的で、クラス(のAppManagerを)持っている、である(私のシングルトンを示唆していない、レガシーコードから;) )


class AppManager { 
    public: 
    static void methodX(){ 
    // same-code 
    } 
}

どちらを優先するべきですか? 両方ともインライン展開されているため、実行時の違いはありませんか?
どのフォームがよりクリーンですか?

+0

コンパイラの最適化は最も低いレベルで最もうまく動作しますが、最高レベルでは完全に失敗します(つまり、「これは手元のタスクに最適なアルゴリズムです」)。したがって、このレベルではなく、コンパイラができないレベルで最適化する必要があります。 – MSalters

答えて

6

まず最初に、この機能はフレームごとに何千回も呼び出されない限り、それほど気にする必要がないということで、非常に気になります。

第2に、コードがインライン化されていると、コードは(期待されるほど)最適化されて、静的でない関数の兆候が全くないようになります。それは同じであろう。

インライン化されていない場合でも、その差は軽微です。 ABIは "this"ポインタをスタティック関数では実行しないレジスタ(またはスタック)に入れますが、やはりネット結果はほとんど測定できません。

ボトムライン - 可能な限りクリーンな方法でコードを書いてください。この時点でのパフォーマンスは問題ではありません。

+0

+1良いアドバイスをしてください。常に保守可能なコードを最適化することができます。 – ereOn

0

私の意見では、インラインでの方が高速です。 インライン関数はコンパイル時にコード内で置き換えられるため、レジスタを保存したり、関数呼び出しを行ったり、再度戻る必要はありません。静的関数を呼び出すと、それは単なる関数呼び出しであり、インライン関数よりもオーバーヘッドが大きくなります。

+0

静的関数もインライン化できます。 – EboMike

+0

@ebomike:静的なインラインを使用している場合!質問は静的とインラインの違いを望んでいます –

+0

質問は "両方がインライン化されている"と述べました。 – EboMike

0

これは最も一般的な最適化問題だと思います。最初のレベルでは、コードを書くときにコンパイラがコードをうまく最適化できない場合には、コンパイラの助けとなるすべてのトリックを試してみてください。これは間違っています。コードを書く際の最適化の最初の段階で何を探しているのかは、きれいで分かりやすいコード、デザイン、構造です。それは手で "最適化"されたはるかに優れたコードで作成されます。

ルール:
ベンチマークコードのリソースがない場合は、最適化コードを必要としない場合よりも書き直して、最適化に長時間を費やします。ほとんどの場合、コードをうまく構成すれば、あらゆる種類の最適化を得ることは困難です。

関連する問題