RE: henyepMail [SPAM Suspected] Re: [cpp]请问:3000个try{}catch{}宏是否会影响程序的性能呢?

Carl Liu(Henyep SZ) xxliu at cn.henyep.com
Mon Dec 24 15:37:18 CST 2007


加入大量TRY CATCH不是为了防止程序溃,  我只是想在程序运行了一段时间之后,假
如崩溃,我想有一个办法来记录出错的文件名和行号,以便于排错。  对于异常,OS会
对其进行首次处理,处理完之后才会调用编译器级的CATCH来改变代码执行流向,如果
没有CATCH程序就崩溃了。  但是编译器级的TRY CATCH机制的实现,编译器是否只是把
CATCH功能的函数作为异常处理的回调函数将其地址压到FS寄存器供OS调用就算其全部
工作(开销)呢?另外, CATCH是否可以CATCH到内存访问违规以外的异常呢。似乎所
有的异常都是以&# 8220;内存访问违&# 8221;的形式表现出来。









《HYM_English, simplify and traditional , KUWAIT》

-----------------------------------
Regards


                    Carl  
-----------------------------------
-----Original Message-----
From: cpp-bounces at codingnow.com [mailto:cpp-bounces at codingnow.com] On Behalf
Of Kyle M. Lee
Sent: 2007年12月20日 23:56
To: C++ Discuss Group
Subject: henyepMail [SPAM Suspected] Re: [cpp]请问:3000个try{}catch{}宏是否
会影响程序的性能呢?  

Carl Liu(Henyep SZ) 写道:
> 最近准备开发一个服务器程序,为了在程序崩溃时得到出错的代码位置(文件
> 名,行数), 我想通过TRY/CATCH的机制自定义一个宏来实现。如下:
> #define rp(x) \
> try{x;}\
> catch (...)\
> {CString str; str.Format("Crashed on Line:%d,in File:%s",__LINE__,
> __FILE__) ;AddtoLog(str, LOG_RELEASE) ; exit(1) ;}
> 3000组左右的 TRY/CATCH
> 这样,在程序中涉及到内存操作的代码都会加上这个宏 (如, rp(
> memcpy(dest,src,size_t)) ;),大概会增加3000组左右的TRY/CATCH, 问题在
> 于这3000~5000组左右额外的TRY/CATCH对性能的影响有多大?
以前做过程序性能优化,所做的部分工作正是你现在所作的&# 8220;逆操作&# 8221;,呵呵~
对于try catch以及异常产生的性能负担,一般被分为:
1. 类似 set jump 的跳转注册
2. 现场作用域记录
3. 发生异常的堆栈弹出(此部分和try无关),作用域的对象析构函数调用。

对于去掉核心循环中的try,在当时的系统环境下,直接提高了2倍性能。
具体优化效果和具体的部署环境有密切关系。

最后是加入如此之多的try是没有什么好处的,大概因为代码不够稳定吧?
使用异常以及错误处理,应该设计良好的异常体系,对于程序错误进行分类,分类
catch处理错误。
而处理错误又分为,挽救恢复,和放弃操作等方式。

总的来说,如果是要排除程序错误,建议从建立好的程序测试方法开始。
当然,第一步,代码写好。呵呵~



More information about the Cpp mailing list