首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >异常的C#性能成本

异常的C#性能成本
EN

Stack Overflow用户
提问于 2017-06-12 09:31:15
回答 1查看 1.5K关注 0票数 1

我正在构建一个项目,其中配置文件将作为字典加载。为了防止配置无效,我只添加了一个try catch框架。但我注意到,当异常抛出时,会出现戏剧性的性能下降。所以我做了个测试:

代码语言:javascript
复制
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();

结果是:

例外情况下的时间成本:1789 on 时间成本毫无例外:0MS

这里的JObject是从Newtownsoft.Json中提取的,它不会在找不到键时抛出异常,而不是字典。

所以我的问题是:

  1. 抛异常真的会减慢程序的速度吗?
  2. 当可能出现多个异常时,如何保证性能?
  3. 无论如何,如果我真的想在这种情况下使用字典的话?(关闭KeyNotFoundException?)

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-12 10:29:21

使用Dictionary.TryGetValue可以完全避免示例代码中的异常。最昂贵的部分是try .. catch

如果您无法避免异常,那么您应该使用不同的模式来执行循环中的操作。

而不是

代码语言:javascript
复制
for ( i = 0; i < 100; i++ )
    try
    {
        DoSomethingThatMaybeThrowException();
    }
    catch (Exception)
    {
        // igrnore or handle
    }

它将为每个步骤设置try .. catch,无论异常是否已引发,请使用

代码语言:javascript
复制
int i = 0;
while ( i < 100 )
    try
    {
        while( i < 100 )
        {
            DoSomethingThatMaybeThrowException();
            i++;
        }
    }
    catch ( Exception )
    {
        // ignore or handle
        i++;
    }

只有在抛出异常时才会设置新的try .. catch

BTW

我不能像您描述的那样复制您代码的大规模减速。.net小提琴

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44496000

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档