我有一个自定义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块会产生大量开销会大大降低性能吗?
答案 0 :(得分:3)
在这里抛出异常将是O(1),因为抛出和捕获异常的成本决不取决于集合的大小;这将是一个固定的成本。固定成本可能很高,但不会增长。