gpt4 book ai didi

c# - 为什么检查字典是否包含键会更快,而不是在不存在时捕获异常?

转载 作者:IT王子 更新时间:2023-10-29 03:29:04 25 4
gpt4 key购买 nike

想象一下代码:

public class obj
{
// elided
}

public static Dictionary<string, obj> dict = new Dictionary<string, obj>();

方法一

public static obj FromDict1(string name)
{
if (dict.ContainsKey(name))
{
return dict[name];
}
return null;
}

方法二

public static obj FromDict2(string name)
{
try
{
return dict[name];
}
catch (KeyNotFoundException)
{
return null;
}
}

我很好奇这两个函数的性能是否存在差异,因为第一个函数应该比第二个函数慢——因为它需要检查字典是否包含值,而第二个函数确实需要访问字典只有一次,但哇,它实际上是相反的:

循环 1 000 000 个值(100 000 个存在,900 000 个不存在):

first function: 306 milliseconds

second function: 20483 milliseconds

这是为什么?

编辑:正如您在这个问题下方的评论中注意到的那样,如果有 0 个不存在的键,第二个函数的性能实际上比第一个函数略好。但是一旦有至少 1 个或多个不存在的键,第二个键的性能会迅速下降。

最佳答案

一方面,throwing exceptions is inherently expensive ,因为堆栈必须展开等等。
另一方面,通过键访问字典中的值是廉价的,因为它是一种快速的 O(1) 操作。

顺便说一句:正确的方法是使用 TryGetValue

obj item;
if(!dict.TryGetValue(name, out item))
return null;
return item;

这只访问字典一次而不是两次。
如果你真的想在键不存在时返回null,上面的代码可以进一步简化:

obj item;
dict.TryGetValue(name, out item);
return item;

这是可行的,因为如果不存在具有 name 的键,TryGetValue 会将 item 设置为 null

关于c# - 为什么检查字典是否包含键会更快,而不是在不存在时捕获异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16101795/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com