【发布时间】:2017-06-12 09:31:15
【问题描述】:
我正在构建一个项目,其中配置文件将作为字典加载。为了防止无效配置,我只是添加了一个 try catch 帧。但我注意到,当异常抛出时,性能会急剧下降。于是我做了一个测试:
var temp = new Dictionary<string, string> {["hello"] = "world"};
var tempj = new JObject() {["hello"]="world"};
Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 0; i < 100; i++)
{
try
{
var value = temp["error"];
}
catch
{
// ignored
}
}
sw.Stop();
Console.WriteLine("Time cost on Exception:"+sw.ElapsedMilliseconds +"ms");
sw.Restart();
for (int i = 0; i < 100; i++)
{
var value = tempj["error"]; //equivalent to value=null
}
Console.WriteLine("Time cost without Exception:" + sw.ElapsedMilliseconds + "ms");
Console.ReadLine();
结果是:
Exception:1789ms 的时间成本
无异常的时间成本:0ms
这里的JObject取自Newtownsoft.Json,与Dictionary相反,没有找到key时不会抛出异常.
所以我的问题是:
- 异常抛出真的会减慢程序的速度吗?
- 可能出现多个异常时如何保证性能?
- 如果我真的想在这种情况下使用 Dictionary,是否可以解决?(关闭 KeyNotFoundException?)
谢谢!
【问题讨论】:
-
异常抛出不会减慢你的程序,但捕捉会做
-
解决方法 - 使用字典的
TryGetValue方法,当找不到键时不会抛出异常 - 它只会返回false。如果 key 存在,那么它将返回true并设置您传递的out参数的值 -
如果您要测量性能,请不要在调试器下运行代码。
标签: c# performance dictionary exception