私が別の人の質問に答えていたとき、私はこの質問に出くわしました。コンパイラはどのようにコードを最適化しますか?const、...などのキーワードは役に立ちますか?揮発性物質とインライン関数の事実と、コードをすべて自分で最適化する方法に加えて!
3 に答える
コンパイラは、コードのセマンティクスが変更されないことを保証できる限り、コードを自由に最適化できます。
多くの異なる段階で実行される多くの異なる種類の最適化があるので、コンパイラ最適化ウィキペディアのページから始めることをお勧めします。
ご覧のとおり、最新のコンパイラーはコードの最適化に非常に優れています(プログラマーが特定のプロセッサー命令や癖をすべて活用する方法を本当に知らない限り、コンパイルされたCコードは手書きのアセンブリーよりも高速です)。他の人が言っているように、最初に良いデザインに基づいて明確にするために書いてください。
(コンパイラーが実行できることを超えて)実行できる非常に大きなことの1つは、キャッシュを認識することです。メモリへのアクセスには非常に時間がかかるため、キャッシュは、アクセスしたデータだけでなく、近くの要素も保存することで、あなたを助けようとします。foo
これが、以下よりもはるかに高速に実行される理由bar
です。
array[ NUM_ROWS ][ NUM_COLS ];
foo()
{
int row, col;
int sum = 0;
// accesses the elements in the array continuously
for ( row = 0; row < NUM_ROWS ; row++ )
{
for ( col = 0; col < NUM_COLS; col++ )
{
sum += array[ row ][ col ];
}
}
}
bar()
{
int row, col;
int sum = 0;
// skips from row to row ( big jumps that might miss the cache )
for ( col = 0; col < NUM_COLS ; col++ )
{
for ( row = 0; row < NUM_ROWS; row++ )
{
sum += array[ row ][ col ];
}
}
}
編集:
注意すべきもう1つのことは、文字列の連結が繰り返されることです。間違って行うと、これにより、他の方法では実行されているように見えるコードがO( n )
実際に含まれる可能性があります-ソフトウェアに関するJoelO( n^2 )
の記事を参照してください
編集: s / disk / memory /
最適化のルール:
- しないでください
- 上級ユーザーのみ:まだ実行しないでください
編集:引用(および有用かどうかにかかわらず、その他の情報)はCodingHorrorの記事にあります: ハードウェアは安価で、プログラマーは高価です。ただし、このフレーズ/引用の「起源」を見つけるとよいでしょう。