关于TryCatch捕获错误的简单性能测试
一直以来都很好奇TryCatch捕获一个错误会对性能有多大的损耗,有的人说差异是倍数级的,有的人说差异不大,今天忽然心血来潮就自己写了个Demo测试,因为曾经自己写过一篇文章提到不要滥用TryCatch来捕获已知的错误,却没有用事例佐证过,当然结果也是如预期一般
static void Main(string[] args) { int loopCount=100; List<string> strList = new List<string>(); for (int i = 0; i < loopCount; i++) { strList.Add("str" + i); } int intTemp = 0; Stopwatch sw2 = new Stopwatch(); sw2.Start(); foreach (string str in strList) { Console.WriteLine("不用TryCatch"); int.TryParse(str, out intTemp); } sw2.Stop(); Stopwatch sw = new Stopwatch(); sw.Start(); foreach (string str in strList) { try { Console.WriteLine("这是TryCatch"); intTemp = Convert.ToInt32(str); } catch (Exception ex) { //异常不做处理 } } sw.Stop(); Console.WriteLine("循环次数" + loopCount + "不用TryCatch耗时:" + sw2.ElapsedMilliseconds); Console.WriteLine("循环次数" + loopCount + "这是TryCatch耗时:" + sw.ElapsedMilliseconds); Console.WriteLine("按回车键退出" ); Console.ReadLine(); }
为了直观地看到每一次转换是否进行了,所以在每一次转换前都输出一次是否用到TryCatch,当loopCount为100时运行结果如下:
而当把loopCount的值加大为10000时输出结果如下:
不同的运行环境下的耗时结果不一样,但是两者之间的耗时差距是很大的
当然了,这样的测试有点片面,但从测试数据我们足以得到一种信息——不要把可预知的异常放到TryCatch里面让系统捕获处理
忽然想到,我这个测试时在转换错误时的测试,那么程序如果不捕获到异常会怎么样呢,把代码改成如下
for (int i = 0; i < loopCount; i++) { strList.Add( i.ToString()); }
运行1000次时结果如下(运行环境不同会出现不同结果,我测试多次都是用TryParse比较耗时,大约多100-300)
而在运行10000次时结果如下:
为了验证是否因为TryParse和Convert之间有差异,将程序改动后运行1000次结果如下:
10000次运行结果如下:
多次运行发现结果基本相差不大,偶尔会出现不用TryCatch会耗时长很多,这个留待大牛去解释,但以上测试表明在不出现错误的情况下二者的性能损耗差不多,但在出现错误的情况下却相距甚大
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库