0

我有一个自定义Dictionary<T>的支持集合KeyedCollection。在尝试优化我在分析器中运行时看到的性能问题时,我注意到这IndexOf(T key)是我的问题领域之一。该代码目前实现如下:

public int IndexOf(TKey key)
{
     if (keyedCollection.Contains(key))
     {
         return keyedCollection.IndexOf(keyedCollection[key]);
     }
     else
     {
         return -1;
     }
}

我知道两者都有 O(n) 的大 O 运行时,并且已经在 MSDN 站点上确认了这一点Contains(T key)IndexOf(T key)https://msdn.microsoft.com/en-us/library/ms132438(v=vs.110).aspx
我认为优化此代码的一个好方法是取出一个 O(n) 操作,所以我将代码更改为:

public int IndexOf(TKey key)
{
     try
     {
         return keyedCollection.IndexOf(keyedCollection[key]);
     }
     catch (KeyNotFoundException)
     {
         return -1;
     }
}

当我比较这 2 个操作的运行时间超过 500,000 次时,带有Contains(T key)out 的代码将 try-catch 场景执行了将近 2 倍。

我的问题是,在使用会大大降低性能的 try-catch 块时是否存在大量开销?

4

1 回答 1

3

在这里抛出异常将是 O(1),因为抛出和捕获异常的成本绝不取决于集合的大小;这将是一个固定成本。固定成本可能很高,但不会增长。

于 2015-11-25T18:52:09.683 回答