『性能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;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· [AI/GPT/综述] AI Agent的设计模式综述