私が知る限り、文字列はDelphiでは不変です。あなたがそうするなら、私は理解できます。Delphiの文字列は不変ですか?
string1 := 'Hello';
string1 := string1 + " World";
最初の文字列が破棄され、新しい文字列 "Hello World"への参照が取得されます。
しかし、同じ文字列がコードの異なる場所にあるとどうなりますか?
私は、いくつかの変数を識別するために割り当てられた文字列ハッシュを持っています。したがって、例えば、「変更」はその変更のプロパティのハッシュ値によって識別されます。そうすれば、平等のための「変更」をチェックするのは簡単です。
ここで、各ハッシュは別々に計算されます(一部の値が異なる場合でもインスタンスを分離するためにすべてのプロパティが考慮されるわけではありません)。
質問は、Delphiはどのようにこれらの文字列を処理しますか?ハッシュを同じ10バイトの長さの文字列に分割するように計算すると、何が得られますか? 10バイトの2つのメモリブロックまたは同じメモリブロックへの2つの参照?
明確化:変更は、データベースから読み取られたいくつかのプロパティによって構成され、個々のスレッドによって生成されます。 TChangeクラスには、GetHashメソッドがあり、文字列の結果となる値の一部(すべてではない)に基づいてハッシュを計算します。今度は、他のスレッドが変更を受け取り、以前に処理された変更と比較して、同じ(論理的な)変更を処理しないようにしなければなりません。したがって、ハッシュと、別々のインスタンスを持つので、2つの異なる文字列が計算されます。私は文字列から128ビットのハッシュのようなものに変更することが本当の改善かどうかを判断しようとしています。それは時間を無駄にするだけです。
編集:デルファイのバージョンのDelphi 7.0である
DLLの文字列操作に問題がありました。検索IsMultiThreadがfalseに設定されていることがわかりました。 System.pasで宣言されており、文字列参照のカウントと格納を変更するときに使用されます。私の初期化のセクションでそれをtrueに設定すると、私の問題が解決されました。 –
Stijn - 参照カウント機構は、マルチスレッド化に安全なバスロックインクリメントおよびデクリメント命令を使用します。これらは通常のincとdecよりも遅いです。 IsMultiThreadは、Delphi内からスレッドを作成することによって設定されます。もちろん、Delphi以外のスレッドを作成したり、基本となる基本APIを使用してスレッドを作成しても、それはわかりません。 –