0

私は「パフォーマンス」愛好家のプログラマーであり、基本的な理論上の質問があります。Delphi 7 には、使用されている文字列の種類を識別し、正しい型を自動的に定義する「方法」がありますか?

たとえば、関数の結果の文字列の長さが常に 255 よりも短いことがわかっている場合、次のようにします。

function SomeFunction: String;またはfunction SomeFunction: ShortString;

同じ考え:

function SomeFunction(Num: Integer): Integer;またはfunction SomeFunciont(Num: Byte): Word;

4

2 に答える 2

4

shortstringDelphi 7 であっても、関数と一緒に使用しないでください。

関数の結果として使用される場合、shortstring完全なコンテンツ (つまり、すべての文字) が常にコピーされます。

stringそのため、文字列をコピーせずに文字列の内部参照カウントをインクリメントするだけの単純な変数を使用するよりも遅くなります。

ほとんどの Delphi RTL/VCL ライブラリはstringを使用するため、コードで を使用shortstringすると、これらのメソッドの呼び出しごとに多くの変換が追加されますが、plain を使用する場合はそうではありませんstring。また、Windows API を呼び出す場合、Delphi のstring型は既にゼロで終了しているため、使用時に必要な割り当てと変換が回避されますshortstring

したがって、特にメモリ マネージャーとしてFastMM4shortstringを使用する場合は、Delphi のすべてのバージョンで の方が遅いことを知っておく必要があります。RTL /VCL/API 呼び出しに を使用すると、Delphi コンパイラは実際には非表示のテンポラリを割り当てます。したがって、ヒープからのバッファ...効率的とはほど遠い: 文字列をすぐに使用することをお勧めします!shortstringstring

それが遅いと思われる場合string(マルチスレッドにあまり適していないアトミック参照カウントまたはメモリ割り当てのため)、使用しないでshortstringください 、しかし他の構造-私の答えを参照してください https://stackoverflow.com/a/6076407/458259そしてhttp://delphitools.info/samplingprofiler/のようなツールでプロファイリングせずに最適化しないでください

integer値を使用する関数の場合byte/word/cardinal/integer、速度に違いはありません。私の習慣はinteger、CPU レジスタのサイズに合うように、可能な限り使用することです。Int642つのレジスタまたはスタック上の一時変数を使用するため、32ビット未満の値の種類のみが遅くなります。

更新: 新しいバージョンの Delphi では、" inline" キーワードが使用されます。これは、そのような型を返す小さな関数のパフォーマンスに大きく役立つ可能性があります。また、Delphi 2009 以降、string は Unicode でありshortstring、システムの非 Unicode アプリケーション コード ページに固定されているため、非推奨です。shortstring自分が何をしているのか正確にわかっていて、Alt-F2 を使用して生成された asm コードを確認し、どの非表示の RTL 関数が呼び出されているかを推測できる場合にのみ使用してください。

于 2013-04-07T08:07:31.710 に答える
0

Delphi 7 には、使用されている文字列の種類を識別し、正しい型を自動的に定義する方法がありますか?

パフォーマンスが向上したとしても、コンパイラはそのような変換を行いません。そのためには、データ フロー分析と呼ばれるものを実行する必要があります。言い換えれば、データがプログラムをどのように流れるかを分析し、変数に保持される可能性のあるコンテンツについて推論する必要があります。

ただし、コンパイラはそのような分析を実行しないため、記述したタイプの最適化を行うことはできません。

于 2013-04-07T12:22:03.530 に答える