2010-11-23 10 views
1

一般的には、Removeメソッドを含むクラスインスタンスを使用して.NETプログラミングを行う方がよいでしょうか。vs New Instanceを削除する

問題は:いくつかのデータを持つStringBuilder SBがある場合、.Remove(0、sb.Length)を使用するか、新しいインスタンスを作成してGCを収集するために古いものを残す方が賢明でしょうか。私が知っているいくつかの要因がありますので、私はあなたの意見を知りたいと思います。プロファイラは、これはあなたのアプリケーションの最も重要な部分であることが示されているまで

おかげで、

Sanjin

+0

両方の回答が得られます。 .NETバージョンと同様、.NET 4.0ではStringBuilderの大きな変更が行われました。 –

答えて

2

一般に、新しいものを作成します。

.NETメモリシステムは、多数の小さな短命オブジェクトを素早く作成および割り当て解除するように設計されています。 StringBuilder.Remove()は遅くなる可能性があります。

非常に大きなデータ(80kB以上)の場合、ルールは多くの要因によって少し変わります。

+0

特に、 'Remove'が認識しない(私はソースを調べていない)ので、バッファ全体を削除しているため、文字列の途中から削除するように設計された最適化されていないコードパスになります。もちろん、削除するのは難しいです – CodesInChaos

+0

これは私が必要としている情報だと思います:)データサイズは完璧なリファレンスです^ _ ^ありがとう –

2

は、私は間違いなく、新しいインスタンスを作成するために行くだろう。

このマイクロ最適化の種類の再利用は、読者にコードの意図について混乱させるだけです。

1

代わりに.Remove(0, sb.Length)を使用してください。.Clear()を使用してください。読み込みが容易で、Removeがこの特別なユースケースに対して最適化されていない場合、Clearも高速になります。
新しいStringBuilderを割り当てるだけです。 StringBuilder自体は軽量なので、新しいものを使用することは高価になるとは思わない。
私は通常、Clear()を区別せず、1つのパフォーマンス上の利点に基づいて新しいStringBuilderを割り当てますが、より良い読みやすいコードを作成します。それはあなたのユースケースに依存します。プロファイラが必要であることを示していない限り、マイクロ最適化しないでください。
私の経験では、メソッドの先頭に新しいStringBuilderを割り当て、関数の戻り値を生成するときにはToStringを呼び出します。その場合、StringBuilderを再利用するために関数インタフェースを複雑にするのはばかげている。

ToString()と呼ぶと、StringBuilderが内部であるため、内部バッファは不変になり、StringBuilderは次の変更に新しいものを割り当てる必要があります。

1つのマイクロ最適化は、結果の長さを正確に(または少なくとも下限を)知っている場合、StringBuilderのコンストラクタに容量を渡すことです。次に、アレイを複数のステップで成長させる必要はありません。たとえば、出力が10000文字以上であることがわかっている場合は、10000の容量までビルダーを初期化することができます。

+0

OK、ClearはRemoveよりもいいですが、OPを使うべきでしょうか? –

+2

これは、どちらがより良い読みやすいコードを生成するかによって主に異なります。 – CodesInChaos

+0

はい、私はその文(または編集)を逃しました –

関連する問題