代码揭秘第9章–瓶颈与优化.docVIP

  1. 1、本文档共51页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
代码揭秘第9章–瓶颈与优化

本书名称:代码揭秘-从c/c++的角度探秘计算机系统 作者: 左飞 即使程序编码工作已经完成,程序员可以做的事情仍然很多。如果你有很好的数据结构知识并为程序设计了比较好的算法,然后你也掌握了计算机系统运行的机制,理解了编译器的行为,并尽你所能地以贴近这些原理的方式去书写代码,而结果你也无法绝对避免出现纰漏。因为实际项目往往非常庞大!许多细小的问题在产生之初并不为人所重视,当程序逐渐丰满起来后,原来的“小问题”所造成的影响就可能被放大,这就是所谓的“蝴蝶效应”。特别是在许多这样的小问题的共同作用下,最终影响的程度可能令人无法估计。这时,你就必须找出程序运行的瓶颈并优化具体的代码,这是一项非常有意义的事情。但让一个能够正确工作的程序变得高效却也不是一件容易的事情。首先,程序员必须准确地发现程序效率不高的症结所在。然而在浩如烟海的代码中寻找这样的“症结”犹如大海捞针,谈何容易?做到最优往往是不可能的,但依然可以在有限的范围内逼近最优。特别值得庆幸的是,通过一些既有的技术手段,尽可能地优化代码在目前看来其可行性是很高的!本章就来讨论这方面的一些话题,并给出在实际中可操作的一些方法。 9.1 优化还是不优化 现在我们要讨论的一个问题是如何使程序运行得更快。但必须说明的是,极致的效率并不是实际中一个程序的最重要属性!通常,程序员更关心的事情是如何开发出易于编写、调试和维护的程序,有谁会为了一些看似并不明显的效率改进而绞尽脑汁地去琢磨一些数据结构和算法方面的难题呢。下面这三点原则支持了上述观点。 首先,一个正确的程序,即使它的效率不高,计算出正确结果的时间也要比一个不正确的程序所耗用的时间短。因此如果一个算法能够保证程序可靠地运行,那么就使用它吧,尽管它是一个简单却效率不高的算法。Bruce Eckel在其著名的《Thinking in C++》一书中有一句话是这样说的:“First make it work, then make it fast.”,翻译过来就是,首先使其能够正常工作,然后再考虑将其优化。所以如何写一个正确的程序才是最重要的! 其次,一个完成的程序,计算出正确结果的时间总要比一个还在开发的程序所耗用的时间短。开发高效程序的时间往往较长,甚至有可能当开发成功时,它们也已经不再被需要了。《庄子》记叙了这样一则故事——“周昨来,有中道而呼者。周顾视,车辙中有鲋鱼焉。周问之曰:‘鲋鱼来!子何为者邪?’对曰:‘我,东海之波臣也。君岂有斗升之水而活我哉?’周曰:‘诺,我且南游吴越之王,激西江之水而迎子,可乎?’鲋鱼忿然作色曰:‘吾失我常与,我无所处。吾得斗升之水然活耳。君乃言此,曾不如早索我于枯鱼之肆!’”意思是说——庄子路上遇到一条鲫鱼在沟里喊救命,庄子答应它去请吴越国君放西江之水救它,鱼儿怒道:我现在有斗升之水就可救命,你这样说,还不如早早到咸鱼店去见我呢!类比于我们所说的程序设计问题,我们应该明白已经完成的程序才是可用的程序,把希望寄托于一个想象中的程序是不切实际的。再举个并不一定恰当的例子(但这个例子仍然能够很明了地解释这种观点)。众所周知,绝对意义上安全的密码是不存在的。一个安全的密码只是指在信息有效期内无法被破译的密码。如果说被加密的信息有效期是五十年,而破解它的密码却需要五百年,那么这个密码就是安全的,因为即使五百年后密码被成功破解了,这个密码也已经没有任何实际价值了。如果我们花费很长的时间去开发一个高效的程序,就有可能出现同样的结果,即程序开发成功了,它也没有用武之地了。 最后,目前计算机的速度大约每18个月就翻一番。计算机技术发展如此的迅速,以至于效率上的提高往往是通过等待下一代硬件的出现来实现的。如果一个用户使用的是一款交互式设置的程序(目前几乎所有的程序都是交互式的),那么由于人机界面设计上的一些结果,可能会使得用户在交互的过程中,几乎不能感觉到那些由于算法优化而被提升的效率,至少这种感觉不如直接升级硬件来得强烈。 举个例子来说:一个不需要交互的程序,例如,计算一个高精度的圆周率值(如保留小数点后面一千万位有效数字),这时程序是否从设计和编码角度被优化,人们的感觉会非常强烈。因为在这漫长的计算过程中,人机之间缺乏交互,只需要输入一个初始状态,然后计算机就会按照既定的算法开始计算,直到得到结果后输出,用户对于这个过程的长短非常敏感。但是,在通常情况下,目前一个用户所使用的程序都不是这样的,例如,在Windows环境下安装一个软件的过程,用户总是要单击许多回“下一步”按钮,时不时地还需要输入一些信息。那么从单击一回“下一步”按钮到单击下一回“下一步”按钮的过程中,计算机也使用了一些算法来执行这个过程,这种情况下,我们费尽心机地来优化程序编码以使其效率有所提高,可能这种微量级的改进,用户根本就体会

文档评论(0)

ktj823 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档