『性能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;