代码优化概要

代码优化概要

ID:42408346

大小:28.50 KB

页数:3页

时间:2019-09-14

代码优化概要_第1页
代码优化概要_第2页
代码优化概要_第3页
资源描述:

《代码优化概要》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、我编写程序至今有35年了,我做了很多关于程序执行速度方面优化的工(一个示例),我也看过其它人做的优化。我发现有两个最基本的优化技术总是被人所忽略。注意,这两个技术并不是避免时机不成熟的优化。并不是把冒泡排序变成快速排序(算法优化)。也不是语言或是编译器的优化。也不是把产4写成i«2i*4的优化。这两个技术是:使用一个profiler。查看程序执行时的汇编码。使用这两个技术的人将会成功地写出运行快的代码,不会使用这两个技术的人则不行。下面让我为你细细道来。使用一个Profiler我们知道,程序运行时的90%的时间是用在了10%的代码

2、上。我发现这并不准确。一次又一次地,我发现,几乎所有的程序会在1%的代码上花了99%的运行时间。但是,是哪个1%?—个好的Profiler可以告诉你这个答案。就算我们需要使用100个小时在这1%的代码上进行优化,也比使用100个小时在其它99%的代码上优化产生的效益要高得多得多。问题是什么?人们不用profiler?不是。我工作过的一个地方使用了一个华丽而奢侈的Profiler,但是购买这个Profiler后,它的包装3年还是那么的暂新。为什么人们不用?我真的不知道。有一次,我和我的同事去了一个负载过大的交易所,我同事坚持说他知道

3、哪里是瓶颈,毕竟,他是一个很有经验的专家。最终,我把我的Profiler在他的项冃上运行了一下,我们发现那个瓶颈完全在一个意想不到的地方。就像是赛车一样。团队是赢在传感器和日志上,这些东西提供了所有的一切。你可以调整一下赛车手的裤子以让其在比赛过程中更舒服,但是这不会让你赢得比赛,也不会让你更有竞争力。如果你不知道你的速度上不去是因为引擎、排气装置、空体动力学、轮胎气压,或是赛车手,那么你将无法获胜。编程为什么会不同呢?只要没有测量,你就永远无法进步。这个世界上有太多可以使用的ProfilerTo随便找一个你就可以看到你的函数的调

4、用层次,调用的次数,以前每条代码的时间分解表(甚至可以到汇编级)。我看过太多的程序员冋避使用Profiler,而是把时间花在那些无用的,错误的方向上的“优化”,而被其竞争对手所羞辱。(译者陈皓注:使用Profiler时,重点需要关注:1)花时间多的函数以优化其算法,2)调用次数巨多的函数一如果一个函数每秒被调用300K次,你只需要优化出0.001毫秒,那也是相当大的优化。这就是作者所谓的1%的代码占用了99%的CPU时间)查看汇编代码几年前,我有一个同事,MaryBailey,她在华盛顿大学教矫正代数(remedialalgebr

5、a),有一次,她在黑板上写下:x+3=5然后问他的学生“求解X”,然后学生们不知道答案。于是她写下:_+3=5然后,再问学生“填空”,所有的学生都可以回答了。未知数x就像是一个有魔法的字母让大家都在想“X意味着代数,而我没有学过代数,所以我就不知道这个怎么做”。汇编程序就是编程世界的代数。如果某人问我“inline函数是否被编译器展开了?”或是问我“如果我写下产4,编译器会把其优化为左移位操作吗?”。这个时候,我都会建议他们看看编译器的汇编码。这样的回答是不是很粗暴和无用?通常,在我这样回答了提问者后,提问都通常都会说,对不起,我

6、不知道什么是汇编!其至C++的专家都会这么回答。汇编语言是最简单的编程语言了(就算是和C++相比也是这样的),如:ADDESI,x就是(C风格的代码)ESI+=x;而:CALLfoo则是:foo();细节因为CPU的种类而不同,但这就是其如何工作的。有时候,我们甚至都不需要细节,只需要看看汇编码的长啥样,然后和源代码比一比,你就可以知道汇编代码很多很多了。那么,这又如何帮助代码优化?举个例子,我几年前认识一个程序员认为他应该去发现一个新的更快的算法。他有一个benchmark來证明这个算法,并且其写了一篇非常漂亮的文章关于他的这个

7、算法。但是,有人看了一下其原来算法以及新算法的汇编,发现了他的改进版本的算法允许其编译器把两个除法操作变成了一个。这和算法真的没有什么关系。我们知道除法操作是一个很昂贵的操作,并且其还在一个内嵌循环中,所以,他的改进版的算法当然耍快一些。只需耍在原来的算法上做一点点小的改动一使用一个除法操作,那么其原来的算法将会和新的一样快。而他的新发现什么也不是。下一个例子,一个D用户张贴了一个benchmark来显示dmd(DigitalMarsD编译器)在整型算法上的很糟糕,而Ide(LLVMD编译器)就好很多了。对于这样的结果,其相当的有

8、意见。我迅速地看了一下汇编,发现两个编译器编译出来相当的一致,并没有什么明显的东西要对2:1这么大的不同而负责。但是我们看到有一个对long型整数的除法,这个除法调用了运行库。而这个库成为消耗时间的杀手,其它所有的加减法都没有速度上的影响。出乎意料

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。