转载于:舒小龙 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遍)*

img

注意:第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));

img

catch 性能瞬间损失 200 倍;

*结论:*

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

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

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

*案例:*

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

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

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

*自己的感想:*

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

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

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

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

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

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

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

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

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