質問

Delphiのインライン関数またはプロシージャ(具体的にはv2010ですが、Turbo Delphiで同じ問題が発生しました)はどうなりますか?

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

しかし、一般にインライン関数(コードが3行または4行の非常に単純な関数であっても)は、コードを高速化するのではなく、低速化することがわかりました。

素晴らしいアイデアは、「すべてをインライン化する」コンパイラオプションです。 exeが50%程度成長しても、動作が速くなるかどうかは気にしません。

Delphiがコンパイラによってインライン化されることが決定されていなくても、コードを実際にインライン化させることができる方法はありますか?それは本当に役立つでしょう。それ以外の場合は、「手動インライン化」を行う必要があります。ここで「///インライン化」のようなコメントを使用してコードの複数の領域全体にプロシージャコードを複製するため、次の5行を変更する場合、このコードが存在する他の8つの重複箇所で変更します

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

役に立ちましたか?

解決

短いルーチンの自動インライン化のためのコンパイラオプションがあります。 [プロジェクトオプション]の[Delphiコンパイラ]->コンパイル->コード生成、「コードインライン化制御」を有効にする自動に。ただし、インラインコードはデバッグするのが難しいため、これはリリースビルドでのみ行う必要があることに注意してください。

また、プログラムが速くなる限りプログラムを大きくしてもかまいませんが、多くの場合インライン化すると遅くなります。あなたはそれが関連しているかもしれないことに注意する必要があります。コンパイルされたコードが大きいほど、命令キャッシュのミスが多くなり、実行速度が低下します。

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

他のヒント

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

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

通常、ループを含む関数をインライン化するのは得策ではないことがわかりました。それらはメモリ内で終わる可能性が高いいくつかの変数を使用し、インラインコードを遅くします。

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

コンパイラーは、ほとんどの人間(私を含む)よりもずっと賢い人々によって書かれており、インライン化するかどうかを決定する際により多くの情報にアクセスできることを覚えておいてください。

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

インライン化される機能を持つユニットを「葉」にする場合はIOW。ユニットを作成し、プロジェクトのuses句の最初に配置します(.dpr)。これで問題ありません。 " leaf"ユニットとは、プロジェクト内の他のユニットに依存せず、コンパイル済みのユニットにのみ依存するユニットのことです。

Delphiでも同じ原理に基づいてユニットシステムを共有しているため、Delphiでも同じであることに驚かないでしょう。

また、個別のコンパイル原則に違反することなく、かなり修正不可能です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top