2009-11-28 38 views
5

デルファイのインライン関数またはプロシージャ(特にここではv2010ですが、Turbo Delphiと同じ問題があります)とは何ですか?Delphi 2010のインライン展開は役に立たないですか?

何らかのディスクリプタがあるのは、それが何らかの意味で「特定の基準」のために関数をインライン化するとは限りません。

しかし、一般にインライン関数(コードが3行または4行の非常に単純なものでさえ)は速度を上げるのではなく、コードを遅くすることが分かっています。

「すべてをインライン化」するコンパイラーのオプションがいいでしょう。私のexeが50%ほど成長するかどうかは気にしないでください。

コンパイラによってインライン化されていないとしても、Delphiに実際にインラインコードを強制する方法はありますか?それは本当に助けになるでしょう。それ以外の場合は、コードの複数の領域全体に手順コードを複製する必要があります。「//インライン展開は失敗しました。次の5行を変更する場合は、他の8つの重複箇所を変更してください。 "

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

答えて

11

短いルーチンの自動インライン化のためのコンパイラオプションがあります。プロジェクトオプションのDelphiコンパイラ - >コンパイル - >コード生成の下で、 "コードインライン化制御"を自動にします。ただし、インラインコードはデバッグするのが難しいため、リリースビルドでのみ使用するようにしてください。

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

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

+1

コードインラインコントロールが自動に設定されていませんでした。 サンプリングプロファイラは素晴らしいです。ボトルネックがどこにあるかを示すのに非常に役立ちます。たとえそれが本当に私に何を見せてくれたとしても。それは将来確実に役立つでしょう。 ありがとうございます。 – TallGuy

3

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

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

私は、ループを含む関数をインライン化することは一般的には良い考えではないことがわかりました。彼らは、インラインコードを遅くする、メモリに終わる可能性のあるいくつかの変数を使用します。

+2

特定のアルゴリズムを実行するために必要なバイト数を増やすと、CPUキャッシュをさらに使い果たします。まれに、これも影響を与える可能性があります。 –

+3

ラース+1 - それほど珍しいことではありません。 –

1

強制インライン化の場合、インクルードファイルを使用します。正しい変数を宣言してから、{$ I filename.inc}を使用する必要があります。そうすれば、いつでも特定のコードを必要な場所に注入し、変更が必要な場合は保守を簡単にすることができます。

コンパイラは人間よりも賢く、単なる死人(自分自身を含む)によって書かれ、インラインにするかどうかを判断するときにはより多くの情報にアクセスできるので、インラインではないときには、 。

0

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

IOWインライン関数を持つユニットを "リーフ"ユニットにして、それをプロジェクトのuses節(.dpr)の最初に入れると、それは問題ありません。 「リーフ」ユニットでは、プロジェクト内の他のユニットに依存しないユニットを意味します。すでにコンパイルされたユニットのみです。

同じ原則に基づいてユニットシステムを共有しているので、デルファイでも同じことは驚きません。

別の編集原則に違反することなく、かなり修正不可能です。

関連する問題