6

解析している場合は、HTML とだけ言いましょう。要素名を読み取ったら、それをインターンすることは有益でしょうか? ここでのロジックは、このパーサーが同じ文字列 (要素名) を何度も解析するということですか? そして、いくつかのドキュメントが解析されます。

仮説:

// elemName is checked for null.
MarkupNode node = new MarkupNode() 
{
   Name = String.IsInterned(elemName) ? elemName : String.Intern(elemName),
   ...
};

この質問は、質問string-interning-memoryによって動機付けられました。

4

2 に答える 2

2

これがあなたのパフォーマンスに役立つかどうかは正確には言えません. 使用する文字列の数と、それらの文字列のインスタンスを作成する頻度によって異なります。通常、インターンは自動的に行われるため、文字列がインターンされているかどうかを明示的に確認すると、実際にはオーバーヘッドが増加し、パフォーマンスが低下する可能性があります。メモリ使用量に関しては、インターンされた文字列は間違いなく少ないメモリを使用できます。

文字列インターンを使用したい場合は、それを達成するためのより良い方法がいくつかあります。何よりもまず、パブリック文字列定数でいっぱいの静的クラスに要素名を貼り付けます。プログラムのソース コードに含まれる文字列リテラルは、確実かつ自動的にインターンされます。このような文字列は、アプリケーションが読み込まれるときにインターン プールに読み込まれます。コンパイル時のインターンの準備のために文字列を定数として定義できない場合は、完全な三項式 String.IsInterned(...) を実行するのではなく、単純にString.Intern(...)を呼び出しますか? ... : String.Intern(...). Intern メソッドは、文字列がインターンされているかどうかを自動的にチェックし、インターンされている場合はインターンされたバージョンを返し、そうでない場合はインターン プールに文字列を追加し、そうでない場合はそれを返します。自分で IsInterned を手動で確認する必要はありません。

繰り返しますが、文字列を手動でインターンすることでパフォーマンスが向上するかどうかはわかりません。定数を使用すると、最適な方法で自動的にインターンされます。これは、定期的に再利用される文字列のパフォーマンスとメモリ使用量を改善するための最良の方法です。正直なところ、手動​​インターンは避けて、コンパイラとランタイムに最適化を処理させることをお勧めします。

于 2009-08-31T08:21:08.160 に答える
1

もちろん、インターン文字列はパフォーマンスに役立ちますが、@jrista が言ったように、「定数を使用すると、自動的にインターンされます...」。

参考になりそうな記事をいくつか紹介しますが、

C# 文字列パフォーマンスの最適化

概要: メモリを共有する C# は、「インターン テーブル」と呼ばれるものを保持します。これは、現在参照されている文字列のリストです。新しい文字列が作成されると、内部テーブルがチェックされます。文字列が既にそこにある場合、両方の変数はインターン テーブルによって維持される同じメモリ ブロックを指します。

http://blog.cumps.be/string-concatenation-vs-memory-allocation/

于 2009-08-31T08:28:10.423 に答える