1

メモのテキストの数学計算を行う必要があります。[ファイルのサイズ:〜2mb]

適切な例は、デコードする必要のあるエンコードされたテキストです。

メモテキストを文字列に渡してデコードします。スレッドを使用してデコード関数を実行する方がはるかに高速だと思います。しかし、グーグルをした後、自分の目的に合った良い例が見つかりませんでした。

関数の例:

function entr_base_N(my_text:String):String;
var
    ts_hamil64:Integer;
begin
    For ts_hamil64 := 1 to Length(my_text) do
    begin
         Result:= Result + Chr(Ord(my_text[ts_hamil64])+10)
    end;    
end;
.....
.....
Memo1.Text:=entr_base_N(Memo1.Text)

作業を細かく分割し、ジョブを均等に分割します。たとえば、3..8スレッドを使用して、デコード関数をそれらのスレッドに割り当てます。これについて教えていただけますか?

テキストファイルを処理する現在の時間:〜35秒。よろしくお願いします。

4

2 に答える 2

5

スレッド化は問題ではありません。関数entr_base_Nは即座に実行されます。デバッガー内で試してください。時間がかからないことがわかります。最近のコンピューターでは、2MBの文字列を処理するのは簡単です。とはいえ、可能な場合は常にリターンバッファを事前に割り当てることをお勧めします。

結果の文字列をメモコントロールに送り返すためにすべての時間が費やされます。何が起こっているのかというと、#13と#10の文字を#23と#20に変換しているということです。どういうわけか、メモコントロールはそれを好みません。行送りのない文字列を返送していて、メモのワードラップコードのパフォーマンスが悪いようです。

これがそうであることを確認するための迅速で汚い方法は、メモに設定WordWrapすることです。False

ここでの重要な教訓は、最適化を試みる前にボトルネックを正しく特定する必要があるということです。しかし、この質問に答えるための私の最初の失敗した努力が示すように、それは陥りやすい罠です。

于 2012-07-05T21:56:14.127 に答える
1

Memo1.Textへの割り当てを高速化するには、次を使用できます。

memo1.Perform(wm_setredraw, 0, 0);
try
  memo1.Text:= entr_base_N(memo1.Text);
finally
  memo1.Perform(wm_setredraw, 1, 0);
  memo1.invalidate;
end;
于 2012-07-14T16:43:03.360 に答える