2012-07-30 2 views
6

私は内部にプライベートList<T>フィールドを持つ可変クラスを持っています。私のクラスのReset()メソッドでは、Clear()メソッドを使用してリストをクリアするか、そのフィールドに新しいリストを割り当てるだけですか?リストはパブリックではなく、クラス自体によってのみ使用されることに注意してください。新しいリストを割り当てると、古いリストに到達できなくなります。 Clear()メソッドis an O(n) operation以降、新しいリストを割り当てることの欠点は何か疑問です。プライベートコレクションを消去するか、それをヌルに設定しますか?

答えて

5

私が考えることができる唯一の欠点は、リストをもう一度使用する必要がある場合は、新しいスペースを割り当てる必要があることです。

これを無効にすると、リストとその内容(他の参照がないと仮定)がGCに適格になります。これをクリアすると、アイテムは削除されますが、メモリは割り当てられたままになります。

個人的には、私がもう一度それを必要としても、サイズは完全に変わってしまいます。

更新:以下のコメントに関連して、これらのオブジェクトはオブジェクトのプールで管理されると述べています。私は最終的な答えを得るために小さなプロファイリングコンソールアプリケーションを作成することをお勧めします。ディスカッションでは、インプリメンテーションの詳細と、オブジェクトプールの意図された使い方にステップインしています。これにより、簡単に答えが変わる可能性があります。

一般的に言えば、長さがあまり変わらず常に必要とされるリストがある場合は、Clearを使用してリストに新しいメモリを割り当てないようにします。リストの長さが多く変更される可能性がある場合や、使用法がまれである場合は、リストを遅延させてメモリを再利用したり、メリットを得ることができます。

+0

したがって、2kバイトのバイトのリストがあれば、どちらの方が高速でしょうか?私、クリアまたはGCを呼び出す、再配置をやっている?私は内部にこれらのリストを持つ約1-2kのオブジェクトを持っているので私はこれを尋ねます。だから、パフォーマンスが良い方が良いかどうか確かめたいです。 –

+0

@ d4wn個人的には、それが問題であることを証明できるまで、パフォーマンスについて心配しません。それはあなたがリストで何をしたいかによって異なります。アイテムがもはや必要ではなく、リストサイズを必要とする可能性が高い場合、またはリストの増加のためにメモリの再割り当てを避けたい場合は、 'Clear'を実行します。あなたが後でリストを気にしない、あるいはそれがたくさん縮むかもしれないなら、私は 'list = null;リスト=新しいリスト() 'どちらの状況でも、GCはx-manyオブジェクトを収集するので、問題ではありません。潜在的なパフォーマンスの違いは、O(n)の反復とリストの成長の再割り当ての違いになります。 –

+0

もう1つ質問:リストの成長のためにメモリの再割り当てを避けたいのはなぜですか?私はこれらのオブジェクトにプールを使用し、アプリケーションが実行されている限り、何度も何度も再利用されるでしょう。毎回再割り当てを行うのは高価ですが、GCについてはあまり知られておらず、このプロセスがパフォーマンスにどれだけ影響を与えるかはわかりません。 –

0

それではなぜそれがnullですか?リストにアクセスする既存の方法は、新しい、空のリストに機能し続けることができますがこれは、ガベージコレクションのヒープ上の古いリスト滞在をさせる、あなたのためのトリックを行います:

this.FooList = new List<Foo>(); 
+1

「自分のフィールドに新しいリストを割り当てる」と書いています。私が「無効にする」という言葉を使用したのは、フィールドが到達不能になり、GCがそれを収集できるためです。しかし、あなたは正しい、私は質問を編集する必要があります。とにかく問題は、どちらがより速く、どの利点/短所が別のものよりも優れているかということでした。 –

+0

GCの視点から、それをヌルにしたり、再割り当てしたりすることは同じです。それをヌルにして後で再割り当てすると、遅延インスタンス化のメリットが得られます。 –

0

Reset呼び出した後、私はコンストラクターが呼び出された後のオブジェクトと同じ状態にオブジェクトが残されます。

コンストラクタで新しい空きが作成された場合は、Listを実行します。していない場合はnullにしてください。

+0

それは私が決定しようとしていることです。リストをコンストラクタで一度設定し、それをクリアして何度も繰り返し使用するか、必要に応じて遅延して作成し、Resetでnull(または新しいリスト)に設定します。 –

+0

@ d4wn私の意見では、パフォーマンスはこの決定を促すべきだとは思わない。私はそれを 'ヌル'にして、遅延読み込みが最もクリーンであると思います、私はそれをします。 – ForkandBeard