大O运行时例外

时间:2015-11-25 18:46:30

标签: c# big-o keyedcollection

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

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

我知道Contains(T key)IndexOf(T key)都有O(n)的大O运行时,并在MSDN网站上确认了这一点。 (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)输出的代码执行了try-catch场景近2倍。

我的问题是,使用try-catch块会产生大量开销会大大降低性能吗?

1 个答案:

答案 0 :(得分:3)

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