6

Delphi で関数やプロシージャをインライン化するとどうなりますか (具体的にはここでは v2010 ですが、Turbo Delphi でも同じ問題がありました)。

ヘルプには、それが意味する「特定の基準」のために、常に関数をインライン化するとは限らないといういくつかの免責事項があります。

しかし、関数をインライン展開すると (コードが 3 ~ 4 行の非常に単純なものであっても)、コードの速度が上がるどころか遅くなることがわかっています。

素晴らしいアイデアは、「すべてをインライン化する」コンパイラ オプションです。実行速度を上げるために exe が 50% ほど大きくなってもかまいません。

コンパイラによってインライン化されることが決定されていない場合でも、Delphi に実際にコードをインライン化させる方法はありますか? それは本当に役に立ちます。それ以外の場合は、「//ここでインライン化に失敗したため、次の 5 行を変更する場合は、このコードが存在する他の 8 つの重複箇所でそれらを変更してください。 "

ここにヒントはありますか?

4

4 に答える 4

12

短いルーチンの自動インライン化のためのコンパイラ オプションがあります。プロジェクト オプションの [Delphi Compiler] -> [Compiling] -> [Code Generation] で、[Code inlining control] を [Auto] に設定します。ただし、インライン コードはデバッグが難しいため、これはリリース ビルドでのみ行う必要があることに注意してください。

また、プログラムが速くなる限り大きくしてもかまわないとおっしゃいましたが、インライン化すると遅くなることがよくあります。関係している可能性があることに注意してください。コンパイルされたコードが大きいほど、命令キャッシュ ミスが多くなり、実行が遅くなります。

プログラムを本当に高速化したい場合は、プロファイラーで実行してください。無料のSampling Profilerをお勧めします。これは、Delphi コード (2010 を含む) で動作するように作成されており、実行が遅くなることはありません。実際に実行に最も時間を費やしているコードの詳細なレポートが表示されます。それが見つかったら、ボトルネックに注目して最適化を試みることができます。

于 2009-11-28T05:31:18.200 に答える
4

インライン化すると、場合によっては処理が遅くなることがあります。インライン関数を使用すると、ローカル変数に必要な CPU レジスタの数が増える場合があります。使用可能なレジスタが十分にない場合、代わりに変数がメモリに配置されるため、速度が低下します。

関数がインライン化されていない場合、(ほぼ) すべての CPU レジスタが使用可能になります。

通常、ループを含む関数をインライン化することはお勧めできません。それらは、最終的にメモリに格納される可能性が高いいくつかの変数を使用し、インライン化されたコードを遅くします。

于 2009-11-28T08:48:00.283 に答える
2

インライン化を強制する場合は、インクルードファイルを使用します。正しい変数を宣言していることを確認してから、{$ Ifilename.inc }を使用する必要があります。これにより、特定のコードが常に必要な場所に挿入され、変更が必要になった場合の保守が容易になります。

コンパイラは、ほとんどの人間(私を含む)よりもはるかに賢く人々によって書かれており、インラインかどうかを決定するときに、より多くの情報にアクセスできることを覚えておいてください。したがって、インラインでない場合は、おそらく正当な理由があります。

于 2009-11-28T15:07:25.723 に答える
0

FPC コンパイラ開発者 (同じ問題がある) の 1 つを正しく理解していれば、インライン化は、インライン化するルーチンが既にコンパイルされている場合にのみ発生します。

IOW インライン化される関数を含むユニットを「リーフ」ユニットにし、それをプロジェクト (.dpr) の uses 句の最初に配置すると、問題ありません。「リーフ」ユニットとは、プロジェクト内の他のユニットに依存せず、既にコンパイルされたユニットのみに依存するユニットを意味することに注意してください。

同じ原則に基づく単位系を共有しているため、Delphi でも同じであることに驚かないでしょう。

また、個別のコンパイルの原則に違反しない限り、かなり修正できません。

于 2009-11-28T20:51:54.827 に答える