私は少し奇妙なことを求めていますが、これが私の要件です (これは少し計算集約的で、これまでのところどこにも見つかりませんでした)。
<TKey, TValue>
約30アイテムのコレクションが必要です。しかし、コレクションは大規模にネストされたforeach
ループで使用されており、真剣に、最大で 10 億回近く繰り返される可能性があります。コレクションの操作は簡単で、次のようになります。
Dictionary<Position, Value> _cells = new
_cells.Clear();
_cells.Add(Position.p1, v1);
_cells.Add(Position.p2, v2);
//etc
要するに、約30個のアイテムの追加とコレクションのクリアに過ぎません。また、値はある時点で別の場所から読み取られます。キーによるこの読み取り/取得が必要です。だから私は a の線に沿って何かが必要ですDictionary
。現在、CPU からすべてのオンスを絞り出そうとしているので、いくつかのマイクロ最適化も探しています。1 つには、追加中に重複が既に存在するかどうかをチェックするコレクションを必要としません (これにより、通常、追加の場合と比較して辞書が遅くなりますList<T>
)。重複をキーとして渡さないことはわかっています。
Add
メソッドはいくつかのチェックを行うため、代わりにこれを試しました:
_cells[Position.p1] = v1;
_cells[Position.p2] = v2;
//etc
List<T>
ただし、これは、次のような典型的な実装よりも、約 10,000 回の反復で約 200 ミリ秒遅くなります。
List<KeyValuePair<Position, Value>> _cells = new
_cells.Add(new KeyValuePair<Position, Value>(Position.p1, v1));
_cells.Add(new KeyValuePair<Position, Value>(Position.p2, v2));
//etc
これで、完全な反復の後、かなりの時間までスケーリングできます。上記の場合、リストからインデックスでアイテムを読み取ったことに注意してください(テスト目的では問題ありませんでした)。私たちにとって定期的な問題List<T>
は多く、主な理由はキーでアイテムにアクセスできないことです.
私の質問は次のとおりです。
キーで項目にアクセスできるカスタム コレクション クラスはありますが、追加中に重複チェックをバイパスしますか? サードパーティのオープン ソース コレクションであれば何でも構いません。
または、
IDictionary<TKey, TValue>
インターフェースからカスタムコレクションクラスを実装する方法について、良いスターターを教えてください
アップデート:
私は MiMo の提案に従いましたが、List はさらに高速でした。おそらく、辞書作成のオーバーヘッドに関係しているのでしょう。