2011-06-24 3 views
0

私のプロジェクトの1つの終わりのため、いくつかのディスカッションを行いました(Robが非常に詳細な答えを提供しない場合はD)。一部の空腹の文字列処理領域でのメモリとサイクルの最適化私のケースでは、2つのケースで特別なパフォーマンスの違いがあるようなものがあれば、いくつかのパフォーマンステストに興味があります。オブジェクト指向パスカルでのインラインVS線形文字列処理パフォーマンス - Delphi

ケース1:文字列処理をインラインで使用していますので、例えば、

RichEdit1.SelText := stringfunction1(stringfunction2(stringfunction3(stringfunction4, stringfunction5), stringfunction6, stringfunction7(stringfunction8)))) 

又は

ケース2:

私はすべてのこれらの機能を分割するので、それぞれが別々のラインで実行され、したがって、Iは、リターンバッファなる変数を宣言しなければなりません各機能

P.S.ケース1の角括弧に間違いがないことを願っています。

この質問に関するあなたの所見/意見/批評家はなんですか?

多分、余分なナノ秒を得るには時間がかかりませんか?

+0

別々の行に分割する理由は何ですか?必ずオブジェクトコードが生成されます。コンパイラは、ケース1で暗黙のローカル変数を使用します。 –

+3

**早すぎる最適化**のように見えます:http://c2.com/cgi/wiki?PrematureOptimization – jpfollenius

答えて

3

コード

var 
    s1, s2: string; 
begin 
    s1 := 'This is a very long string...'; 
    s2 := s1; 
end; 

ないは(タイトループ内でパフォーマンスの問題がある可能性があります)文字列s2s1をコピーし、それは単にで同じ場所にs2をポイントに指示しますメモリはs1となります。つまり、一般的に、変数に文字列を割り当てることは非常に悪いことではありません。

実際、どのメソッドが最も効率的なアセンブリコードを生成するかはわかりません(同一でない場合)。インライン展開の場合でも、中間結果をどこかに保存する必要があります。

オールインワンで、私は間違いなく、人間プログラマにとって最も読みやすいアプローチにすべきだと思います。 。パフォーマンスの違いは検出できないはずです。

4

変数を宣言しても違いはありません。

このような関数を呼び出すと、コンパイラは暗黙の文字列変数を生成して関数の結果を保持する必要があります。あなたがそれをやっている方法の主な利点は、コンパイラが一時変数を使って再利用することを決定できるということですが、コンパイラが明示的な変数で同じことをすることを妨げるものはありません。

実際には、文字列結果を返す関数を呼び出すたびに、コンパイラは一時変数を作成する必要があります。文字列を返す関数は実際には追加のvarパラメータを持つプロシージャとして実装されるためです。exempleについては

:最初の一時的な文字列変数を割り当てるコンパイラ

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    Memo1.Lines.Text := GetTempPath; 
end; 

function GetTempPath : string; 

は本当に、次の手順を与えられたので、このよう

procedure GetTempPath(var S : string); 

が実装されています。上記のtemp変数をパラメータとしてGetTempPathを呼び出します。戻ったら、この変数をとり、Memo1.Lines.Textに設定します。基本的に、どのようなそれは本当に行うことはこれです:

procedure TForm1.Button1Click(Sender: TObject); 
var S : string; 
begin 
    GetTempPath(S); 
    Memo1.Lines.Text := S; 
end; 

、あなたが実際には次のような関数を宣言した場合、コンパイラはadditionnal変数を作成しないように十分にスマートです。

procedure TForm1.Button1Click(Sender: TObject); 
var S : string; 
begin 
    S := GetTempPath; 
    Memo1.Lines.Text := S; 
end; 
0

大丈夫です。

私は2つの文の中に物事をまとめようとします。 :)

  • 文字列の最適化 は基本的にので、それは非常に非常に非常にリア 状況やユースケースでは、パフォーマンスのボトルネック であるという事実の早期optimmization です。

  • インラインストリングの使用の主な利点は、それ以前の戻り値(temp)変数をさらにパラメトリック関数呼び出しで再利用できるコンパイラ機能を使用することです。それでも、線形演算を使用する場合は、メインの文字列等化コードの前にGetTempPath()プロシージャを追加して、メモリ内にアクセス可能な古いtemp変数を使用するようにしてください。

+0

オプティマイザは値を保持するレジスタを再利用するかそれはしません。必要に応じて、一時変数もどこかに格納されます。論理全体がインライン化されているという事実は、それを変更しません。インライン展開では、読みにくいものになりますので、私はそれをお勧めしません。 GetTempPathは、メモリ内の一時変数を再利用することとはまったく関係がありません。 Windowsが一時ファイルを書き込むために使用するディレクトリを返します。 –

関連する問題