2017-02-23 7 views
0

は、私は以下の持っているString sの宣言をループの外に移動された場合に任意の違いを確認ループ内にオブジェクト宣言を置くとパフォーマンスが低下しますか?

for (i = 1..100000) { 
    String s = make_some_string(i); // this function depends on `i` only 
    output_this_result(s); 
} 

うスニペットと仮定しますか?私は、コンパイラが各ループの文字列オブジェクトを構築して破壊しないほど賢明だと思います。しかし、それはの代わりに、stringのように複雑なものでしたか?

+4

テストしてください。生成されたasmを見てください。 –

+0

コンパイラは十分にスマートですが、テストが必要だと思います。 –

+4

新しい文字列が生成され、 'make_some_string()'によって割り当てられ、後で各繰り返しで破棄されます。あなたは両方の試みの違いを測定しようとしましたか?あなたは何を観察しましたか? – moooeeeep

答えて

1

ループ内にオブジェクト宣言を入れるとパフォーマンスが低下しますか?

あります。これは、オブジェクトのタイプとコンパイラによって実行された最適化によって異なります。またmake_some_stringが返すもの(Stringはコピーか変換か?)とおそらくmake_some_stringがコンパイラに見えるかどうか(同じ翻訳単位で定義されていますか?)によって決まります。

オブジェクトを内部に宣言すると、オブジェクトはすべての反復の開始時に構築され、最後に破棄されます。コンストラクタとデストラクタを呼び出すことは、それらを呼び出さないよりも遅くなる可能性があります。呼び出しは、副作用がなく、その実装がコンパイラに見える場合にのみ、最適化することができます。

0

文字列をループ内または外部に宣言する必要があるかどうかを尋ねるときに、より効率的な3番目のオプションがありません。

は考えてみましょう:

for (i = 1..100000) { 
    output_this_result(make_some_string(i)); // Depend on `i` only 
} 

sを除去することにより、完全にあなたがそれを宣言する場所を決定する必要はありません。明らかにこれは、output_this_resultが文字列参照を取ってそれを修正するのではなく、論理的に見える名前が与えられていることを要求します。 そして私は、どのコンパイラでもこれよりも悪いコードが生成されるのではないかと疑います。

(forループ構文はC++のようには見えませんが、質問の一部です)

関連する問題