8

バイナリのサイズは実行速度にどのように影響しますか? 具体的には、ANSI-C で記述されたコードを gnu または intel コンパイラを使用して機械語に変換することについて話しています。バイナリのターゲット プラットフォームは、Linux オペレーティング システムを実行する Intel または AMD マルチコア CPU を搭載した最新のコンピューターです。このコードは、openMP を使用しておそらく並列で数値計算を実行し、バイナリは数メガバイトになる可能性があります。

実行時間は、コードとライブラリのロードに必要な時間よりもはるかに長くなることに注意してください。中程度のシステム サイズでは通常 CPU に依存するが、メモリに依存することもある運動方程式のシミュレーションのために、大規模な常微分方程式系を解くために使用される非常に特殊なコードについて考えます。

小さなバイナリ サイズが非常に効率的なコードの設計基準であるべきかどうか、または明示的なコード (関数として実装できるコード ブロックを最終的に繰り返す) とコンパイラの最適化 (ループ展開など) を常に優先できるかどうかを尋ねています。

プロファイリングのテクニックと、それを特定の問題に適用する方法については知っていますが、どの程度まで一般的なステートメントを作成できるか疑問に思っています。

4

2 に答える 2

4

CPUにはキャッシュがあります。

CPU速度と比較して、システムメモリへのアクセスは遅いです。そのため、CPUには(超高速メモリで作られた)キャッシュがあります。

CPUキャッシュの各レベルには、異なるサイズと速度があります。

したがって、可能な限り最大の速度を達成するには、最低レベルでのキャッシュの更新を回避することが非常に重要です(残念ながら、これは最小のキャッシュでもあります)。

との両方codedata、キャッシュの更新が強制されます。したがって、どちらの場合もサイズが重要になります。

例:あなたまたは。の場合、キャッシュミスが発生するCode 可能性があります。でをロードすると、キャッシュミス発生する可能性があります。jumpcallData variableremote address

速度に大きな影響を与える可能性のある他の問題がありますがalignment、CPUキャッシュミス以上の費用はかかりません(CPUキャッシュのリロードにはCPUコアの同期が含まれ、それは簡単な作業ではありません。250CPUサイクルのようなものがかかる可能性があります!)。

プラットフォーム固有の詳細を入力しなくても、それが言えることです。

結論:シンプルにしてください。そして小さいのは美しいです。

于 2012-10-17T16:15:59.443 に答える
3

CPUはコードの一部しか実行していないため、速度を決定するのはコードの内容であり、コード内をどれだけ移動するかです。

10Mbのコードがあり、最初の9Mbが起動時に1回だけ実行される場合、その9Mbが遅いか、90Mbか90kbかは関係ありません。CPUがその時間の99.99%をいくつかの非常に効率的な計算を行う小さなタイトなループに費やす場合、CPUは高速になり、100,000行のコードを何度も実行する必要がある場合は、おそらくはるかに遅くなります。

最適化とは、CPUがほとんどの時間を費やしている場所を確認し、そのコードを、答えを得るために必要なCPUサイクル数で可能な限り効率的にすることです。場合によっては、メインパーツの作業をより簡単/高速にするために、その外に余分な「準備」コードを追加することを意味する場合があります。

一部のシステムでは、バイナリサイズが大きな懸念事項ですが(EG組み込みデバイス)、他のシステムでは、ほとんど完全に無関係です。

参照: http: //www.codeproject.com/Articles/6154/Writing-Efficient-C-and-C-Code-Optimization

于 2012-10-17T16:23:28.507 に答える