using System; using System.Text; namespace 异常处理的性能损失 { /// <summary> /// C# 异常处理性能损耗 /// 代码作者:jehnjehn /// Email:jehn@foxmail.com /// 【jehnjehn推荐的原则:尽可能避免异常而不是捕获并处理异常】 /// </summary> class Program { static void Main(string[] args) { int testTimes = 10000;//自定义测试次数。 StringBuilder sb = new StringBuilder(string.Concat("执行", testTimes, "次循环运算时,几种异常处理方式性能对比(按运行时间越短性能越高)")); sb.AppendLine(Environment.NewLine); System.Diagnostics.Stopwatch w = new System.Diagnostics.Stopwatch(); //方式一:避免异常而非捕获异常 int a = 0; w.Start(); for (int i = 0; i <= testTimes; i++) { Int32.TryParse("a", out a); } w.Stop(); sb.AppendLine(string.Concat("TypParse避免异常:", w.ElapsedMilliseconds, "ms")); //屏蔽所有异常,这种脑残的写法仅供测试 w.Reset(); w.Start(); for (int i = 0; i <= testTimes; i++) { try { Int32.Parse(null); } catch { } } w.Stop(); sb.AppendLine(string.Concat("屏蔽式捕获所有异常:", w.ElapsedMilliseconds, "ms")); //抛出指定的异常实例 w.Reset(); w.Start(); for (int i = 0; i <= testTimes; i++) { try { if (!Int32.TryParse("a", out a)) { throw new ArgumentNullException(i.ToString()); } } catch { } } w.Stop(); sb.AppendLine(string.Concat("抛出指定的异常实例:", w.ElapsedMilliseconds, "ms")); //静态异常变量,仅测试 int b = 0; Exception ex = new Exception(); w.Reset(); w.Start(); for (int i = 0; i <= testTimes; i++) { try { if (!Int32.TryParse("a", out b)) { throw ex; } } catch { } } w.Stop(); sb.AppendLine(string.Concat("抛出静态异常:", w.ElapsedMilliseconds, "ms\n")); Console.WriteLine(sb); System.IO.File.WriteAllText("result.txt", sb.ToString()); Console.WriteLine("Press any key to continue . . . "); System.Diagnostics.Process.Start("result.txt"); //Console.ReadKey(true); } } }
结果如下:
执行10000次循环运算时,几种异常处理方式性能对比(按运行时间越短性能越高)TypParse避免异常:1ms屏蔽式捕获所有异常:836ms抛出指定的异常实例:326ms抛出静态异常:185ms