当前位置 : 主页 > 编程语言 > c语言 >

vb.net – Try / Catch是否比哈希查找更昂贵?

来源:互联网 收集:自由互联 发布时间:2021-06-24
我知道异常捕获可能很昂贵,但我想知道是否有些情况下它实际上比查找更便宜? 例如,如果我有一个大字典,我可以测试一个键的存在: If MyDictionary.ContainsKey(MyKey) Then _ MyValue = MyDiction
我知道异常捕获可能很昂贵,但我想知道是否有些情况下它实际上比查找更便宜?

例如,如果我有一个大字典,我可以测试一个键的存在:

If MyDictionary.ContainsKey(MyKey) Then _
  MyValue = MyDictionary(MyKey) ' This is 2 lookups just to get the value.

或者,我可以捕获一个例外:

Try
  MyValue = MyDictionary(MyKey) ' Only doing 1 lookup now.
Catch(e As Exception)
  ' Didn't find it.
End Try

异常捕获总是比上面的查找更昂贵,还是在某些情况下更少?

关于字典查找的事情是它们在恒定或接近恒定的时间内发生.无论您的词典是包含一个项目还是一百万个项目,您的计算机都需要大约相同的时间.我提出这个问题是因为你担心在大字典中进行两次查找,而现实情况是它与在一个小字典中进行两次查找没什么不同.作为旁注,其中一个含义是字典并不总是小集合的最佳选择,尽管我通常发现额外的清晰度仍然超过这些小集合的任何性能问题.

确定字典查找速度的速度之一是为特定对象生成hash值所需的时间.有些对象比其他对象更快.这意味着这里的答案取决于词典中的对象类型.因此,唯一可以确定的方法是构建一个测试每个方法几十万次的版本,以找出更快完成集合的方法.

另外要记住的一个因素是它主要只是Catch块在异常处理时很慢,因此您需要寻找合理匹配您在生产中所期望的查找命中和未命中的正确组合.因此,您无法在此找到一般指南,或者如果您这样做可能会出错.如果你很少有一个错过,那么我希望异常处理程序做得更好(并且,由于错过了一些,很好,特殊,它也将是正确的解决方案).如果你经常错过,我可能更喜欢不同的方法

虽然我们正在努力,但不要忘记Dictionary.TryGetValue()

网友评论