繁体   English   中英

大O运行时异常

[英]Big O Runtime of Exceptions

我有一个自定义的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)的big-O运行时,并且已经在MSDN站点上确认了这一点。 https://msdn.microsoft.com/zh-cn/library/ms132438(v=vs.110).aspx
我认为优化此代码的一种好方法是删除O(n)操作之一,因此我将代码更改为:

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

当我比较这两个大约超过500,000个操作之间的运行时时,带有Contains(T key)的代码执行了try-catch场景的比例接近2。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM