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 借用网络的一个图,感觉看完就可以了解了 最先调用的函数压入栈低,最后压入得函数在栈顶,函 ...
随机推荐
- 使用AsyncTask实现文件下载并且在状态中显示下载进度
2013年10月24日 上班的第二天 昨天我是用afinal完成的则个功能,但是公司里并不希望使用第三方的代码,所以要求我在不使用第三方开源项目的情况下实现. 最先我是使用Thread开启一个子线程, ...
- [python]自动化将markdown文件转成html文件
*:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...
- 纯脚本组装Json格式字符串
var answerStr = "["; for (var i in answer) { var data = $("input[name=QuestionItem_&q ...
- delegate notification kvo三者比较
IOS 如何选择delegate.notification.KVO? 前面分别讲了delegate.notification和KVO的实现原理,以及实际使用步骤,我们心中不禁有个疑问,他们的功能比较类 ...
- CAD 二次开发----- 块(一)
1.块定义与块参照两个概念 块定义类似于模具,而块参照类似于模具浇筑出来的模型,在图形中只需用块定义来保存块的实际几何组成,而仅用插入点和比例因子来存储块定义,因为块参照的几何形状与快参照完全一样,仅 ...
- 解决EasyUI动态添加标签渲染问题
以下代码用于Js脚本中: var Work_Content_Back = "<table width='99%' class='table' style='margin-bottom: ...
- Java学习笔记 04 类和对象
一.类和对象的概念 类 >>具有相同属性和行为的一类实体 对象 >>实物存在的实体.通常会将对象划分为两个部分,即静态部分和动态部分.静态部分指的是不能动的部分,被称为属性,任 ...
- iis最大工作进程数
IIS 6.0允许将应用程序池配置成一个Web园(Web Garden).要理解Web园的概念,可以设想这样一种情形:假设有一个IIS 5.0服务器和三个Web网站,每一个Web网站运行着相同的应用程 ...
- jQuery in action 3rd - Working with properties, attributes, and data
properties properties 是 JavaScript 对象内在的属性,可以进行动态创建,修改等操作. attributes 指的是 DOM 元素标记出来的属性,不是实例对象的属性. 例 ...
- iOS 选择的照片或者拍照的图片上添加日期水印
1..引入框架 #import "CLLocation+GPSDictionary.h"#import "NSDictionary+CLLocation.h" ...