0

私は今日約450の入力を持っています、そしてそれは将来増加するかもしれません。(場合によっては、450未満、おそらく100または20で実行されます)

私にとっては次の方が良いですか:

  • 容量を設定しない
  • 容量を低く設定(100)
  • 容量をわずかに450未満に設定
  • 容量を450よりわずかに上に設定します
  • 容量を450より適度に高く設定する
  • 容量を予想よりもはるかに高い値に設定します(80%多い?、2回?)

増加の数としてnを使用します(実際の複雑さではありません)私は、それを予想よりも小さいn = 440に設定するか、何かが「複雑さ」を与えることを薄くしますn + 2n =(3n)

一方、少し上に置くと(n = 460)、nだけになります

また、n = 800に設定すると、高いn(ほぼ2n)(高いが、TrimToSizeを使用して改善しますか?

最良の選択は何ですか?

4

4 に答える 4

6

正直に言うと、相対的な効率という実際のポイントを損なうと思うので、nのすべての話をざっと見ました。

「最良の選択」は、を使用しSystem.Collections.Generic.List<T>、それを適切なものに初期化してから、プロファイリングで問題があることがわかるまで心配しないことです。

ジェネリックリストを使用すると、強力な型指定がサポートされ、値型を使用すると、ボクシングの問題を回避できます。

リストのサイズが絶えず変化している場合、またはリストがあまり長く存続しない場合は、リストをトリミングしてもそれほど改善されません(ある場合)。関連するサイズについて特定のことを知っている場合は、初期容量を使用するオーバーロードされたコンストラクターを使用して、いくつかの再割り当てを節約できます。

var list = new List<int>(450);

初期容量に達した後、リストは独自の内部ロジックを使用してサイズ変更を続け、さらに取得する量を決定します(サイズを指定しない場合のデフォルトは、サイズを2倍にすることです:4から始まり、8、16 、32など)。

于 2012-07-04T12:39:19.540 に答える
3
  • これらの数値(<1000)を使用すると、それほど重要ではありません。

  • 初期容量がないと、8、16、32、64などのlog(n)の再割り当てが増加します。

したがって、ターゲットにいくらか近い値を使用してください。ここでは400は800と同じくらい良いです。おそらく1回の再割り当てがあり、ほとんど Nのスペースでのオーバーシュートは避けられません。

于 2012-07-04T12:38:56.153 に答える
1

ArrayListは.net1.1用です

使用できるList<T>のはジェネリッククラスです。

オブジェクトへのボックス化およびオブジェクトからのボックス化解除を行わずに、特定のタイプの値を格納することをサポートします。ArrayListは、単にオブジェクト参照を格納します。

  1. リストを使用すると、ボックス化/ボックス化解除操作を回避できます。これにより、メモリがn時間節約されます。
于 2012-07-04T12:40:38.570 に答える
0

ジェネリックリストが使えない理由はありますか?これにより、保存する必要のある要素の数に応じて拡張/縮小されます。配列を使用する必要がある場合は、これが比較的小さい数であるため、予想できる最大値の2倍(つまり800)に設定します。数値の場合、これは割り当てるメモリの量が少なくなります。

于 2012-07-04T12:41:14.643 に答える