『性能VS稳定』.Net 的 try-catch 到底浪费多少效率

转载请标明:舒小龙 http://www.cnblogs.com/shuxiaolong/archive/2013/04/10/3012439.html

 

起因:

很多项目基本都不加 try-catch,问为什么,答曰  性能;  

但是,无论是否细节,只要出错,导致的却是 异常(程序 或 网站黄页),开发人员疲于跟进这些细节BUG;

于是想 知道,try-catch  到底浪费多少效率;

 

代码:

 1                 DateTime time1 = DateTime.Now;
 2                 for (int i = 0; i < 10000000; i++)
 3          {
 4                     try{ int temp = Convert.ToInt32("1234567890"); }
 5                     catch (Exception exp) { }
 6          }
 7                 DateTime time2 = DateTime.Now;
 8                 for (int i = 0; i < 10000000; i++)
 9          {
10                     int temp = Convert.ToInt32("1234567890");
11          }
12                 DateTime time3 = DateTime.Now;
13 
14                 Console.WriteLine("时间差(ms):\t有try\t{0}", ((time2 - time1).TotalMilliseconds));
15                 Console.WriteLine("时间差(ms):\t无try\t{0}", ((time3 - time2).TotalMilliseconds));
16                 Console.WriteLine();

 

结果:(运行10遍)

注意:第7,第10次:有 try-catch 的居然超过 没有 try-catch  的。

一千万次 try-catch 执行,也只需要 1.6秒,损失基本不记。

 

如果错误:

 1                 DateTime time1 = DateTime.Now;
 2                 for (int i = 0; i < 10000000; i++)
 3          {
 4                     try{ int temp = Convert.ToInt32("ABC"); }
 5                     catch (Exception exp) { }
 6          }
 7                 DateTime time2 = DateTime.Now;
 8                 Console.WriteLine("时间差(ms):\t有try\t{0}", ((time2 - time1).TotalMilliseconds));

catch  性能瞬间损失  200 倍;

 

结论:

try  并不浪费效率,真正浪费效率的是 catch;

catch 你会浪费效率,不 catch 直接崩溃;

现在将问题改成     “错误时浪费效率  和  错误时程序崩溃  你选择哪样?”

 

 

案例:

前公司,一个网站 6台服务器,每天 40W人访问;

开发部代码要求:自己的模块不影响别人的模块,所以  为了规避意外;代码中常见:一个函数 从开始就 try  ,函数结尾  catch 写异常日志 (try-catch  就像是函数体的一部分);

结果:网站稳定,性能很快。

 

 

自己的感想:

真正的性能  并不是  你不用 try-catch;不用 LinQ;不用 EF;

真正参与过 项目,特别是  交付他人的项目(不包括 产品,主营网站) 效率不高,往往是:

     错误的算法(比如内存分页);

     后期的治标不治本的狗皮膏药(眼看就要交付了,BUG只要让他不报错就行);

     架构中 执行了可以不执行的代码;

 

真正的稳定  也不一定是  随时随地的 try-catch;

     认真写好每一个函数的代码,(不确信可能导致异常时 可以加 try-catch) 或者 (即使出现异常 也没有关系) 或者 (完全肯定不会出现异常的 代码);

     对其他方法的调用 的 返回值 采取 不信任态度——不要认为 其他方法 就一定能返回你需要的值;

     所有的网络通讯,分布式  必须加 try-catch;

 

 

 

 

 

 

posted on 2013-04-10 16:07  InkFx  阅读(1249)  评论(0编辑  收藏  举报