3

そのリストからすべてのデータをファイルにダンプするまで、着実に成長する要素のリストがあります。次に、そのリストを同じ目的で再利用したいと思います。リストからすべての要素を削除するのではなく、単に新しいリストに割り当てるのは悪い習慣ですか?ガベージコレクションは古いリストを処理する必要があるようです。そうすれば、要素を削除することを心配する必要はありません。

例えば:

var myList = new List<element>();
myList.Add(someElement);
myList.Add(anotherElement);
// dumps the elements into a file

myList = new List<element>();

編集:これを回避する簡単な方法があるとしても、私はそれの哲学的側面についても疑問に思っていました。それを回避する方法があれば、何かをガベージコレクションさせるのは悪いことですか?ガベージコレクションを許可する場合と、要素を削除して同じメモリを再利用する場合のコストはどれくらいですか?

4

6 に答える 6

6

myList.Clear()コーディングはさらに簡単ですmyList = new List<element>();

msdn:List.Clearメソッド

リスト内の各要素はそれ自体が異なるオブジェクトであり、リストをクリアするか、新しいリストを再作成するか、アイテムを1つずつ削除するかにかかわらず、ガベージコレクションを行う必要があります。リストをクリアして再利用するだけでガベージコレクションを行う必要がないのは、リストそのものです。数十万のアイテムを含むリストが膨大でない限り、パフォーマンスの違いを何らかの方法で測定することは困難です。幸い、ガベージコレクターは高度に最適化されており、開発者がガベージコレクターが何をしているのかを考慮する必要があることはめったにありません。

(他の人が指摘しているように、...新しいリストに追加する要素の数と古いリストの要素の数など、さまざまな要因が関係しています...しかし、要点は次のとおりです:ガベージリストの要素の収集に関しては、リスト自体の収集は関係ありません。)

于 2012-07-18T18:54:22.783 に答える
6

リストに含まれる要素の数に少し依存します。リストを支える配列がラージオブジェクトヒープ上にあるのに十分な大きさである場合は、リストをクリアして再利用する方がよい場合があります。これにより、大容量メモリの割り当て数が減り、大容量オブジェクトのヒープの断片化の問題が減ります。(http://msdn.microsoft.com/en-us/magazine/cc534993.aspxおよびhttp://www.simple-talk.com/dotnet/.net-framework/the-dangers-of-the-largeを参照してください。 -object-heap /の詳細については、http://blogs.msdn.com/b/dotnet/archive/2011/10/04/large-object-heap-improvements-in-net-4-5.aspxを参照してください。 .NET 4.5による改善)

リストが小さい場合は、新しいリストを作成する方がよい場合もあれば、呼び出しのパフォーマンスが向上する場合もありますClear()。疑わしい場合は、パフォーマンスを測定してください。

編集:編集で提起する哲学的な質問に答えて、新しいリストを作成する2つの理由は次のとおりです。

  1. 一般に、オブジェクトを再利用しない場合、コードはよりクリーンで推論しやすくなります。ガベージコレクションのコストは低く、コードを混乱させるコストは高くなります。
  2. リストの内容をダンプするコードが別の関数にある場合はどうなるかを考えてみてください。そのリストをローカルコンテキストから渡すと、同じリストへの非ローカル参照が存在する可能性があります。他のコードがリストを変更している可能性があります。または、リストを変更していないと(誤って)想定している可能性があります。
于 2012-07-18T18:58:17.577 に答える
1

私は専門家ではありませんが、GCが古いリストを「処理」することを期待して新しい
リストを 作成することは、悪い習慣であり、おそらく非効率的であるため、おそらく悪い考えです。 これはマイクロ最適化ですが、に達するまで新しい値を「設定」するのが最善の方法だと思います。そうすると、不要な新しいメモリをクリアしたり割り当てたりしないためです(リストが大きい場合を除きます)。スペースを空けたい) とにかく、使用することをお勧めします-それはあなたとGCのトラブルを救います。
list.Countlist.Add
List.Clear()

于 2012-07-18T18:55:45.983 に答える
1

2つの異なる質問をしているようです。1つは、新しいオブジェクトに設定してもよいのか、それとも単にクリアするのかということです。これは、エリックがかなりうまく答えたと思います。2つ目は、GCを無視して、GCを「支援」しようとせずに機能させるかどうかです。つまり、絶対に「はい」と言えます。フレームワークにフレームワークが行うことを実行させ、必要になるまで邪魔にならないようにします。

多くのプログラマーは深く掘り下げたいと思っており、ほとんどの場合、それは役立つよりも多くの問題を引き起こします。GCは、これらのものを収集してクリーンアップするように設計されています。非常に具体的な問題が発生していない限り、機能するコードを記述し、何かが収集されるときに無視して支払う必要があります(適切な場合はusingキーワードを除く)。

于 2012-07-18T19:16:12.533 に答える
0

List.Clear()再利用のためにすべての要素を削除するために使用したいと思います。容量は変更されないため、追加のオーバーヘッドコストが発生せず、GCにメモリガベージコレクションを処理させて、クリーンなコードを維持できます。

于 2012-07-18T19:04:16.703 に答える
0

重要な視点はクリーンなコードです。新しいリストを作成すると、古いリストはGCによって削除されます(他に参照がない場合)。

于 2012-07-18T19:00:05.393 に答える