2009-08-31 4 views
6

あなたが解析している場合、単にHTMLと言うことができます。一度要素名を読むと、それをインターンにすると有益でしょうか?ここでのロジックは、このパーサーが同じ文字列(要素名)を何度も繰り返し解析することです。そして、いくつかの文書が解析されます。インターン文字列はパーサーのパフォーマンスを向上させますか?

論:

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

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

+0

- 私はつもり(私はそれはあなたが後にしている本当にではありません知っているが...)...それを自分で試してみて、それがどんな違いがあれば測定 – Rashack

+0

@Rashackそれをテストするには有効な質問だと思っていますが、HTMLやXMLベースのコンテンツなど、テキスト解析に関する直接的な質問はありませんでした。 :) –

答えて

2

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

文字列インターンを使用したい場合は、それを実現するいくつかのより良い方法があります。まず第一に、パブリック文字列定数でいっぱいの静的クラスに要素名をスティックします。あなたのプログラムのソースコードで見つかった文字列リテラルは、確実かつ自動的に受け入れられます。アプリケーションがロードされると、そのような文字列がインターンプールにロードされます。あなたの文字列をコンパイル時のインターン準備の定数として定義できない場合は、String.IsInterned(...)というだけではなく、String.Intern(...)を呼び出します。 ...:String.Intern(...)。 Internメソッドは、文字列がインターンされているかどうかを自動的にチェックし、存在する場合はインターンされたバージョンを返し、そうでない場合はインラインプールに文字列を追加し、そうでない場合はそれを返します。手動でIsInternをチェックする必要はありません。

この場合も、手動で文字列をインターンリングするとパフォーマンスが向上するかどうかはわかりません。定数を使用すると、自動的に最適化された形で自動的に格納されます。これは、定期的に再利用される文字列のパフォーマンスとメモリ使用率を改善するための最良の方法です。正直言って、手動インターンシップから離れ、コンパイラとランタイムが最適化を処理できるようにすることをお勧めします。

1

もちろん、インターナショナルストリングはパフォーマンスを助けますが、@ jristaは "定数を使用すると自動的にインターンされます..."と述べています。ここで

はSUMMARY

Optimizing C# String Performance

、いくつかの記事はあなたを助けるかもしれないです:メモリを共有、C#が呼ばれるものを維持 "インターンテーブルを。"現在参照されている文字列のリストです。新しい文字列が作成されると、internテーブルがチェックされます。文字列がすでにそこにある場合、両方の変数は、internテーブルによって管理されている同じメモリブロックを指します。これに対する私の一般的な提案は以下のようになり

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

関連する問題