Dictionary<T>
のバッキング コレクションを持つカスタムがありKeyedCollection
ます。IndexOf(T key)
プロファイラーでの実行中に見られるパフォーマンスの問題を最適化しようとしているときに、これが問題領域の 1 つであることに気付きました。コードは現在、次のように実装されています。
public int IndexOf(TKey key)
{
if (keyedCollection.Contains(key))
{
return keyedCollection.IndexOf(keyedCollection[key]);
}
else
{
return -1;
}
}
Contains(T key)
と の両方が O(n) の big-O ランタイムをIndexOf(T key)
持っていることを知っており、MSDN サイトでこれを確認しました。( https://msdn.microsoft.com/en-us/library/ms132438(v=vs.110).aspx )
このコードを最適化する良い方法は、O(n) 操作の 1 つを取り出すことだと思いました、コードを次のように変更しました。
public int IndexOf(TKey key)
{
try
{
return keyedCollection.IndexOf(keyedCollection[key]);
}
catch (KeyNotFoundException)
{
return -1;
}
}
約 500,000 回の操作で 2 つのContains(T key)
実行時間を比較すると、out を使用したコードは、try-catch シナリオを 2 倍近く実行しました。
私の質問は、パフォーマンスを大幅に低下させる try-catch ブロックを使用するときに、大量のオーバーヘッドがあるかどうかです。