0

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 ブロックを使用するときに、大量のオーバーヘッドがあるかどうかです。

4

1 に答える 1