2017-08-03 23 views
2

シンプルな算術を使って何回か繰り返しているコードがあるとします。コンパイラは自動的に最適化しますか?ここでコンパイラは繰り返しコードを自動的に最適化しますか?

例:

someArray[index + 1] = 5; 
otherArray[index + 1] = 7; 

はそれが(ない良い読めるとmaintanableコードの観点から)、ビューのもパフォーマンスの観点から変数 nextIndex = index + 1を導入しても意味がないか、コンパイラは、そのようなことを行います自動的に最適化?

+0

インデックスが基本的な整数型の場合、ほとんどの場合、最適化が有効になります。 – StoryTeller

+4

最適化を有効にしてビルドして、生成されたコードをチェックするのはなぜですか? –

+1

コンパイルしてアセンブリを確認します。おそらくそれは可能だろうが、私は疑わしい。 – NathanOliver

答えて

2

ほとんどすべてのコンパイラが最後に10〜15年以上かかるので、このような簡単な最適化について心配するべきではありません。

しかし、コードに本当に重要な場所があり、この行の生成されたアセンブラコードをチェックしてコンパイラがこの些細な最適化を行ったかどうかを確認するよりも、実行のスピードを最大にしたい場合。

算術演算を1つ追加すると、レジスタやメモリに保存するよりも高速なバージョンのコードになり、コンパイラはこれを知っていることがあります。手動で簡単なケースを最適化しようとすると、コードを遅くすることができます。

また、https://gcc.godbolt.orgなどのオンラインサービスをチェック生成コード(gcc、clang、いくつかのバージョンではicc)に使用できます。

1

古い格言「吸うと見る」がここでは適切だと思われる。我々はしばしば、最も一般的なプロセッサは4/8/16ビットマイクロであり、奇妙で素晴らしいアプリケーション固有のアーキテクチャーと適切な奇妙なベンダー固有のコンパイラーがそれに付随することを忘れています。コンパイラには、コンパイラが「より良い」コードを生成するのを助ける(または混乱させる)ためのコンパイラ拡張が頻繁にあります。

2000年代初頭の1つのDSPは、パイプライン内で並列にクロックサイクルごとに8つの命令を実行しました(複雑 - 「ロード+増分+乗算+加算+ラウンド」)。これが機能するための前提条件は、すべてが事前にレジスタにプリロードされなければならないということでした。これは、レジスタが明らかに(いつものように)プレミアムであることを意味しました。このアーキテクチャでは、空きレジスタに結果を格納し、後で再計算するために並列化できない空きスロット(同じサイクルで他の命令を使用できない命令があります)を使用することがよくありました。コンパイラはこれを "正しい"ものにしましたか?はい、その結果を後で再利用することがしばしばありました。その結果、実行速度が遅くなったレジスタがないためにパイプラインが停止してしまいました。

だから、コンパイルしてコンパイルしたときにコンパイルして、それを調べて、それをプロファイリングして、いつコンパイラが「正しい」状態になって修正できるかを確認してください。言語によってサポートされていない追加の意味情報がなければ、「正しい」ものが何であるかを知ることは本当に難しい。

結論:吸うと

関連する問題