C# 关于Try/Catch对系统性能影响的总结
自从开始考虑代码的运行效率和性能以后,写代码考虑的东西越来越多了,比如什么时候应该加try/catch?加太多的try/catch会不会降低性能?今天就来分享一下对try/catch对性能影响的一些看法。下面先来看三个问题:
问题一:当一段代码被try块包围后与不加try时在没有异常发生的情况下,执行过程是否有区别?
问题一的回答:
1、 try{ }部分和不加try/catch语句块的效率几乎一样, catch{}部分似乎需要100倍以上的时间 ,所以只要不把try{}catch{}作为你的程序的逻辑,这种设计就是合理的.
2、从我的经验看来,在 try 中的代码和在没有 try 的情况下的效率是一样的,没有影响。
问题二: 如果有区别,那么这样的区别对性能的影响有多大呢?
问题二的回答:
1、当同一类型的异常被第一次抛出的时候,明显可以感到效率的降低;但其后再抛出就没什么感觉了。还是什么文章中看到过这样的说法:CLR的异常处理机制相比C++要高效很多。
2、就我学到的编译知识,感觉TRY CATCH会小小影响编译的速度,因为翻译模式内要回填异常的处理地址,而在运行期间应该不会影响速度
3、没什么大的影响,对现在的机器配置来说,这点影响微不足道
4、对效率的影响不大,可以放心使用。因为就算你不写代码去捕获可能出现的异常,.net Framework在运行时也会帮你捕获运行时出现的异常,转向其异常处理程序,结果就是弹出对话框来提示你,我想大家在调试的时候都见识过吧。
问题三: try的代码究竟做了些什么?他对代码做的是每次执行时监视还是以类似中断的的方式,当出现异常时主动调用什么过程转向异常处理.?
问题三的回答:
1、从硬件角度讲,异常和中断是同样的机理,都是在满足一定的条件的时候,由软件和硬件触发,并通过向量转到相应的处理程序。因此,异常在没有被触发的时候,应该是不会对性能造成影响的。
另外,.net在产生异常时是逐步向外层查找处理程序的,就是说,如果当前函数中没有对异常进行处理,才查找调用当前函数的那一个函数,一直找遍整个应用程序,如果还没有,就交给runtime,在这种情况下,效率才是最低的,而且比较难于处理。
2、如果发生了异常,我认为捕获的越早效率越高,但往往我们需要在一个合适的层面上来捕捉,所以有一个平衡问题,还是得具体问题具体分析.
3、个人觉得try catch语句是侦测语句。
try
{
需要侦测语句
}
catch(跟踪错误类)
{
错误操作语句
}
try侦测语句运行情况:
1、 当侦测语句运行出错时,抛出错误类,然后根据错误类提供的信息,执行错误操作语句.
2、使用try catch语句效率低下我觉得有几个原因,首先由于程序需要进行错误侦测,那么执行侦测语句时需要更多的资源,其次,错误操作语句也要消耗相应的资源.
我的总结:
.net在产生异常时是逐步向外层查找处理程序的,因此可以说捕获的越早效率越高.如果当前应用程序没有对异常进行处理,那么当捕获到异常时就会一层一层向外查找,如果没有查找到异常处理程序,就交给runtime,在这种情况下,效率才是最低的,而且比较难于处理。
对于性能上的开销,按照以上的信息基本可以忽略,因为"就算你不写代码去捕获可能出现的异常,.net
Framework在运行时也会帮你捕获运行时出现的异常,转向其异常处理程序...".所以只要你的catch是用来捕获的不可预知的异常应该就不会有额外的开销.
新的疑问:异常交给runtime进行处理效率才是最低的?
经验告诉我似乎即使程序不出现异常时似乎加了try catch的还是要稍慢,个人认为不加try catch时代码的运行速度应该比较快.
猜测:我想编译时在哪个层次上有异常处理应该是被标记了的.该层以下一旦有catch类型异常就跳转到catch块.从而也影响了最终编译程序的大小.
欢迎大家一起探讨!
C# 关于Try/Catch对系统性能影响的总结的更多相关文章
- 流言粉碎机:JAVA使用 try catch 会严重影响性能
目录 一.JVM 异常处理逻辑 二.关于JVM的编译优化 1. 分层编译 2. 即时编译器 1. 解释模式 2. 编译模式 3. 提前编译器:jaotc 三.关于测试的约束 执行用时统计 编译器优化的 ...
- 在 Transact-SQL 中使用 TRY...CATCH
在 Transact-SQL 中使用 TRY...CATCH (注:本文来自于 http://msdn.microsoft.com/zh-cn/library/ms179296.aspx) ...
- EntityFramework Inner Exception Catch
在保存时加入这一段,就可以查看error具体是哪里出错了.正式发布需要删除这段,try catch毕竟会影响性能 try { entity.SaveChanges(); } catch (DbEnti ...
- 提高Linux操作系统性能
提高Linux操作系统性能 2011-01-05 13:48 佚名 字号:T | T 本文从磁盘,文件及文件系统,内存和编译等方面详细的讲述了如何对Linux系统性能进行调谐.不管是Linux服务器还 ...
- try catch引发的性能优化深度思考
关键代码拆解成如下图所示(无关部分已省略): 起初我认为可能是这个 getRowDataItemNumberFormat 函数里面某些方法执行太慢,从 formatData.replace 到 une ...
- Java新人学习(li)
一.项目中搭配使用SVN和Git 安装SVN:安装熟悉Git:安装maven,修改setting.xml文件:安装eclipse,配置jdk.maven路径: 建立自己的Git仓库,熟悉常用的Git命 ...
- OutOfMemoryError异常java内存泄漏(Memory Leak)和内存溢出(Memory Overflow)
本篇文章理解源自于<深入理解java虚拟机>2.4章节 实战:OutOfMemoryError异常 在以下例子中,所有代码都可以抛出OutOfMemoryError异常,但是要区分到底 ...
- JVM 监控,调优,调试
JVM监控工具 Java的安装包自带了很多优秀的工具,善用这些工具对于监控和调试Java程序非常有帮助.常用工具如下: jps 用途:jps用来查看JVM里面所有进程的具体状态, 包括进程ID,进程启 ...
- 栈(stack)信息
栈在JVM虚拟机中是线程的一块私有空间,比如存储函数的调用信息.局部变量等 特性 先进后出和后进先出即FIFO 借用网络的一个图,感觉看完就可以了解了 最先调用的函数压入栈低,最后压入得函数在栈顶,函 ...
随机推荐
- MySQL 5.6 & 5.7最优配置模板
摘自:http://mp.weixin.qq.com/s?__biz=MjM5MjIxNDA4NA==&mid=207854835&idx=1&sn=c998031ae6816 ...
- 织梦建站:视频弹出播放JS+CSS
需要 jquery.js 文件,JS代码一定要放在HTM下面,否则没效果罗! CSS代码: 1.fdspbf{ width:650px; height:550px; position:fixed; l ...
- vi
e! 放弃所有修改,从上次保存文件开始再编辑 shift+g 最后一行 gg 第一行 u 恢复上一次操作 如果查找下一个,按"n"即可. set nu 显示行号 编辑模式下111g ...
- 【Java学习笔记】静态导入
package p2; //import static java.util.Collections.max; import java.util.ArrayList; import static jav ...
- Caused by: java.lang.UnsatisfiedLinkError: Couldn't load BaiduMapVOS_v2_1_3: findLibrary returned nu
我是在整合百度LBS服务与百度语音识别服务的时候遇到这个问题的........ 解决办法是:不要导armeabi-v7a这个文件夹即可. 貌似还有的人试一下以下这种方法(这种方法来自:http://w ...
- 想在Images.xcassets 只能用 imageNamed 加载里边的素材 其他方法 你就别费老劲了
1.Images.xcassets中的素材 (1)只支持png格式的图片 (2) 图片只支持[UIImage imageNamed]的方式实例化,但是不能从Bundle中加载 (3) 在编译时,Im ...
- 【安装mysql数据库】
方法/步骤 请注意上图中选择Custom选项,这样才能修改安装目录. 请注意为了数据安全,不要把mysql安装在系统盘,如C:盘. 可以在其他盘符下,新建两个文件夹,一个存储mysql的文件, ...
- ARM各种处理器参数
来源 ARM公司处理器产品的主要系列 ARM推出的A系列处理器主要型号及规格 big.LITTLE架构:解决处理器耗电与性能之间的矛盾. 小核心主要有A7.A53.A35这三种,他们典型的特点是顺序执 ...
- Spring学习笔记 1. 尚硅谷_佟刚_Spring_HelloWorld
1,准备工作 (1)安装spring插件 搜索https://spring.io/tools/sts/all就可以下载最新的版本 下载之后不用解压,使用Eclipse进行安装.在菜单栏最右面的Help ...
- 将 ASP.NET Core 1.0 应用作为 docker 镜像发布 (Linux版)
var appInsights=window.appInsights||function(config){ function r(config){t[config]=function(){var i= ...