6

通常、コンパイラーは最大速度または最小コードサイズを最適化するように設定していますか? または、個々の最適化設定を手動で構成しますか? なんで?

ほとんどの場合、人々はコンパイラの最適化設定をデフォルトの状態のままにしておく傾向があることに気付きました。これは、Visual C++ では最大速度を意味します。デフォルト設定は、全体的なパフォーマンスの最適化というよりも、L2 キャッシュ内に完全に収まる小さなプログラムである傾向があるベンチマークで見栄えを良くすることに関係があると常に感じていたので、通常は最小サイズに最適化するように設定します。

4

11 に答える 11

6

Gentoo ユーザーとして、私は完全な OS でかなりの数の最適化を試みましたが、それについてGentoo フォーラムで終わりのない議論がありました。GCC 用の優れたフラグがwikiにあります。

要するに、サイズの最適化は、RAM が限られている古い Pentium3 ラップトップで最適に機能しましたが、Core2Duo を搭載したメインのデスクトップ マシンでは、-O2 の方が全体的に優れた結果が得られました。

最も最適化された x86 (32 ビット) 固有のフラグに興味がある場合は、小さなスクリプトもあります。

gcc を使用していて、特定のアプリケーションを本当に最適化したい場合は、ACOVEAを試してください。一連のベンチマークを実行し、コンパイル フラグのすべての可能な組み合わせでそれらを再コンパイルします。サイトでハフマンエンコーディングを使用した例があります(低いほど良い):

A relative graph of fitnesses:

   Acovea Best-of-the-Best: **************************************                (2.55366)
     Acovea Common Options: *******************************************           (2.86788)
                       -O1: **********************************************        (3.0752)
                       -O2: ***********************************************       (3.12343)
                       -O3: ***********************************************       (3.1277)
           -O3 -ffast-math: **************************************************    (3.31539)
                       -Os: *************************************************     (3.30573)

(この Opteron システムでは -Os が最も遅いことがわかったことに注意してください。)

于 2008-09-10T11:52:50.093 に答える
2

キャッシュの局所性が重要であるという事実に加えて(On Freundが述べたように)、Microsoftが行うもう1つのことは、アプリケーションのプロファイルを作成し、起動の最初の数秒間に実行されるコードパスを見つけることです。その後、このデータをコンパイラにフィードバックし、起動時に実行される部分をまとめるように依頼します。これにより、起動時間が短縮されます。

この手法はVSで公開されていると思いますが、100%確実ではありません。

于 2008-09-10T14:23:58.077 に答える
2

私は最小限のサイズを使用することを好みます。メモリは安価かもしれませんが、キャッシュはそうではありません

于 2008-09-10T11:58:31.093 に答える
1

Microsoftは、サイズに最適化されたすべてのC /C++ソフトウェアを出荷しています。ベンチマークを行った後、彼らはそれが実際により良い速度を与えることを発見しました(キャッシュの局所性のため)。

于 2008-09-10T12:25:30.793 に答える
1

最適化には多くの種類があり、最大速度と小さなコードはその 1 つにすぎません。この場合、実行可能ファイルが少し大きくなるため、最大速度を選択します。一方、特定の種類のプロセッサ用にアプリケーションを最適化することもできます。場合によっては、これは良いアイデアですが (自分のステーションでのみプログラムを実行する場合)、この場合、プログラムが他のアーキテクチャで動作しない可能性があります (たとえば、Pentium で動作するようにプログラムをコンパイルします)。 4 マシン -> Pentium 3 では動作しない可能性があります)。

于 2008-09-11T16:09:16.880 に答える
1

私にとっては、使用しているプラ​​ットフォームによって異なります。一部の組み込みプラットフォームや、Cell プロセッサで作業したときは、非常に小さなキャッシュやコード用に提供される最小限のスペースなどの制約があります。

私は GCC を使用しており、最適化の「最も安全な」レベルであり、最小サイズよりも速度を優先する「-O2」のままにする傾向があります。

非常に高性能なアプリケーションを開発している場合を除き、おそらく大きな違いはないと思います。その場合、特定のユースケースのさまざまなオプションをベンチマークする必要があります。

于 2008-09-10T11:49:52.347 に答える
1

両方を構築し、プロファイリングして、特定のプロジェクトとハードウェアでどちらがより適切に機能するかを選択します。

パフォーマンスが重要なコードの場合、つまり、それ以外の場合は、いずれかを選択して気にしないでください。

于 2008-09-15T06:49:23.960 に答える
0

これは、プログラムのアプリケーションによって異なります。高速な工業プロセスを制御するようにアプリケーションをプログラミングする場合、速度を最適化することは理にかなっています。ユーザーの入力にのみ反応する必要があるアプリケーションをプログラミングする場合、サイズの最適化は理にかなっています。つまり、実行可能ファイルのサイズが心配な場合です。

于 2008-09-15T14:06:43.270 に答える
0

そのようなコンパイラ設定の微調整は最適化です。「時期尚早の最適化は諸悪の根源である」という原則に基づいて、プログラムが最終的な出荷状態に近づくまで、私はそれを気にしません。

于 2008-10-26T14:49:13.167 に答える
0

私たちは常に最適な速度を得るために最大化を使用しますが、C++ で記述したすべてのコードは何らかの形でバイオインフォマティクス アルゴリズムに関連しており、コード サイズが比較的小さい一方で速度が重要です。

于 2008-09-10T11:47:40.027 に答える
0

最近のメモリは安価です:)したがって、組み込みシステムで作業しない限り、コンパイラ設定を最大速度に設定することは意味があります。もちろん、答えは具体的な状況によって異なります。

于 2008-09-10T11:49:07.713 に答える