我有一个自定义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 块时是否存在大量开销?