关于代码运行效率问题的一个总结和一点疑问
2007-06-14 10:50
537 查看
首先要承认,这个随笔的名字起得有点儿别扭。
自从自己开发GEA52以来,就一直思考有关程序运行效率的问题。按照自己以往的思路,程序运行得慢了,可能的情形有很多,性能瓶颈可能出现在Web服务器的内存上,Web服务器的cpu上,Web服务器与DB服务器之间的IO开销上,总而言之不经过一番仔细的分析和艰苦的调试是很难解决性能问题的。甚至当有的时候有些操作确实很耗系统资源的时候,你不得不手工限制这种任务的并发数,变并行为串行,以保障其他操作的运行效率。但经过今天上午的调试,我的这些观点发生了一点点变化。
在一个已有的Web系统中,我对其中的一个模块儿进行了重构。这种重构不是为了改善代码结构或者提高代码效率,仅仅是改变模块儿中用到的算法。新算法和老算法的效率是相近的,但重构完之后我却发现系统性能有了非常严重的下降,处理同量数据的耗时提高了1000倍!刚开始我很受打击,检查了重构中涉及的主要部分的执行流程,没有发现可疑点。系统占用的内存和以前一样,循环体被执行的次数和以前一样,和数据库之间的IO只有一次并且很快,问题到底会出在哪儿呢?最后我采用了最笨的办法,注释掉那些我认为可能是运行速度瓶颈的语句,然后逐步缩小怀疑的范围。最后我在循环的第四层找到了这个bug,这是一个不必要的对一个非常重型的方法的调用。要知道,在第三层循环中,只有不到5%的情况会进入出现bug的第四层循环,所以刚开始我一直没有怀疑到这里。但最后就是这倒霉的5%,却占用了整个系统运行时间的99.9%。
说的有些罗嗦,其实道理很简单,恐怕也是我们在刚上大一大二的时候就学过的,那就是不要在循环体内放太耗时间的语句。可惜当自己接触的东西多了,反而把这样最基本的原则都忘了,写代码的时候不够谨慎,对循环体内的方法调用很少考量其执行效率。
把这个东西放到提问区,是想问问各位大牛,.net下面有没有比较轻量级的动态测试工具,能够分析出给定代码块的执行瓶颈?(比如,给出每个语句的执行时间百分比。)
自从自己开发GEA52以来,就一直思考有关程序运行效率的问题。按照自己以往的思路,程序运行得慢了,可能的情形有很多,性能瓶颈可能出现在Web服务器的内存上,Web服务器的cpu上,Web服务器与DB服务器之间的IO开销上,总而言之不经过一番仔细的分析和艰苦的调试是很难解决性能问题的。甚至当有的时候有些操作确实很耗系统资源的时候,你不得不手工限制这种任务的并发数,变并行为串行,以保障其他操作的运行效率。但经过今天上午的调试,我的这些观点发生了一点点变化。
在一个已有的Web系统中,我对其中的一个模块儿进行了重构。这种重构不是为了改善代码结构或者提高代码效率,仅仅是改变模块儿中用到的算法。新算法和老算法的效率是相近的,但重构完之后我却发现系统性能有了非常严重的下降,处理同量数据的耗时提高了1000倍!刚开始我很受打击,检查了重构中涉及的主要部分的执行流程,没有发现可疑点。系统占用的内存和以前一样,循环体被执行的次数和以前一样,和数据库之间的IO只有一次并且很快,问题到底会出在哪儿呢?最后我采用了最笨的办法,注释掉那些我认为可能是运行速度瓶颈的语句,然后逐步缩小怀疑的范围。最后我在循环的第四层找到了这个bug,这是一个不必要的对一个非常重型的方法的调用。要知道,在第三层循环中,只有不到5%的情况会进入出现bug的第四层循环,所以刚开始我一直没有怀疑到这里。但最后就是这倒霉的5%,却占用了整个系统运行时间的99.9%。
说的有些罗嗦,其实道理很简单,恐怕也是我们在刚上大一大二的时候就学过的,那就是不要在循环体内放太耗时间的语句。可惜当自己接触的东西多了,反而把这样最基本的原则都忘了,写代码的时候不够谨慎,对循环体内的方法调用很少考量其执行效率。
把这个东西放到提问区,是想问问各位大牛,.net下面有没有比较轻量级的动态测试工具,能够分析出给定代码块的执行瓶颈?(比如,给出每个语句的执行时间百分比。)
相关文章推荐
- 网上一个关于支持打印的ListView类代码的一点改动
- Java基础学习总结(72)——提升 java 代码的运行效率
- 关于cas-client单点登录客户端拦截请求和忽略/排除不需要拦截的请求URL的问题(不需要修改任何代码,只需要一个配置)
- 关于"如何让应用程序只有一个实例在运行"的孟宪会的解决方法的疑问
- 一段旧代码,引起的关于OO中一个问题的思考
- 关于VC6中基于对话框的程序,往Combox 添加一个CComboBox变量,然后程序编译运行,窗口不出现的问题
- 关于框架底层方法的运行效率问题
- VC运行库版本不同导致链接.LIB静态库时发生重复定义问题的一个案例分析和总结
- VC运行库版本不同导致链接.LIB静态库时发生重复定义问题的一个案例分析和总结
- 关于JavaScript代码的执行效率总结
- 关于运行Drupal 7的Nginx+PHP系统设置的一些问题解决方案总结
- 关于 while(1)和for(;;)效率问题的一点想法
- 一个关于VS2008在其他未安装VS2008的电脑上无法运行编译的程序的问题
- Java基础学习总结(72)——提升 java 代码的运行效率
- VC运行库版本不同导致链接.LIB静态库时发生重复定义问题的一个案例分析和总结
- 关于COOKIES跨域总结(通过一个问题)
- 小程序大问题,MSDN中一个小小示例所带来的疑问,一个关于DataList的一个简单应用
- 关于初学python爬虫的一点问题总结(三)
- 关于运行Drupal 7的Nginx+PHP系统设置的一些问题解决方案总结
- VC运行库版本不同导致链接.LIB静态库时发生重复定义问题的一个案例分析和总结