llvm
またはgcc
コンパイラを使用すると、結果のマシンコードの点で次の2つのコードブロックに違いはありますか?- いつこの最適化が実際に価値があるのですか?
は、最適化されていません:forループの条件を事前計算する価値はありますか?
for (int i=0; i<array.count; i++) {
//do some work
}
は最適化:
int count = array.count;
for (int i=0; i<count; i++) {
//do some work
}
EDIT:私はarray
は不変であるとarray.count
がループの実行中に変化しないことを指摘しなければなりません。
コンパイラが最適化を行う可能性が高いため、しばしば必要ありません。しかし、確かな唯一の方法は、両方の方法と測定をテストすることです。生成されたマシンコードに関しては、簡単に自分自身をチェックすることができます。clangとgccの両方にアセンブラファイルを出力するフラグがあります。何もない場合はいつでも実行ファイルを逆アセンブルできます。 –
この場合、オブジェクトに送られるメッセージがあります。私はコンパイラがそれに干渉するのではないかと疑うので、私の推測では、各繰り返しで 'count'メソッドが呼び出されると思います。しかし、それはおそらく非常に安い呼び出しです。この特定の場合の最善の方法は、配列の高速列挙を使用することです。 – Guillaume
"配列は不変で、array.countは変更されません" - "不変"がコンパイラが理解できるプロパティであるかどうかはわかりませんが、最適化の目的では ' array.count'が変更された場合、コンパイラが 'array.count'が変更されないことを自身が証明できるかどうかは重要です。 –