`
zhangjunji111
  • 浏览: 48002 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Bill Venners与Martin Fowler的对话(性能与过程调优)

阅读更多

5、对话马丁·福勒(Martin Fowler)——第六部分:性能与过程调优
简介

在最后这一部分,Fowler 谈到了如何在效率和可维护性之间寻找平衡点,以及如何开发可调优的软件。他还讨论了模式的作用和《敏捷宣言》。


可维护性与效率

Bill Venners:我在丹佛机场的红地毯俱乐部(Red Carpet Club)[1]中常常碰到名人。今年夏天我碰到了 Calista Flockhart (卡莉斯塔·弗洛克哈特)[2], 而去年我碰到了你。我是个追星族,但是由于害怕哈里森·福特,没敢跟 Calista 搭讪。不过,你和我倒是坐下来喝了杯啤酒。记得当时你曾对我说过,应该以程序员能读懂的字符格式来序列化对象,而不是以二进制代码格式。当我提到字符格式 要比二进制码格式慢时,你说,从效率的角度来看,二进制代码格式使得软件更加难以维护。那么,能否请你谈谈关于序列化方式的具体案例?一般地说,你如何在 可维护性与效率之间寻找平衡点?
Martin Fowler:效率永远是第一位的,前提是你能正确理解它。很多时候问题在于,人们以为做某些事情是为了效率着想,但他们却从不使用性能分析器(profiler)。如果你出于效率的考虑而做某件事,但却不使用性能分析器,那么你所宣称的根本就不着调。
序列化所牵扯的问题要多一些。使用二进制代码做序列化的问题之一就是你无法去查看结果。当你需要存储序列化的对象时,这个问题就更加突 出。Java 的一个典型问题就是如果你改变了一个类,那么就无法读取以前所序列化的对象。类似的,如果一个客户端和一台服务器正通过序列化的对象进行通讯,假如一端的 数据结构进行了更新而另一端没有,那么整个通讯就彻底失效了。
有一个小窍门可以让你绕开这个问题。不要序列化对象本身,而是把数据从对象中提取出来,放到一个字典里,然后再序列化那个字典。这么做会使你能够应对一些变化。
Bill Venners:但是,字典是“不明确的”。我们之前刚刚说起过这点。
Martin Fowler:的确,字典不是“明确的”。不过,如果你往类里添加一个字段,并把这个多出来的值放到字典里 的话,不会有什么问题。因此,这是一个比较强壮的机制。XML 一般也比较强壮,因为你可以对你所不了解的数据视而不见。二进制序列化的主要问题就是它的脆弱性。在我的书《企业应用架构模式》中,更多地提到了序列化的 方式。例如,在数据库中传输和存储数据时,就需要考虑介于字符和二进制之间的序列化格式。


编写可性能调优的软件

Bill Venners:你在《重构》一书中写道:“编写能快速运行的软件的秘诀就在于先编写可性能调优的软件,然后对执行速度进行调优。” 我该怎样编写可性能调优的软件呢?
Martin Fowler:只要做到软件结构合理就可以。
Bill Venners:怎么讲?
Martin Fowler:因为结构合理的软件可以更容易地进行改动。
Bill Venners:也就是说,这时候软件要更容易地进行改动,不是为了添加新功能,而是为了提升已有功能的性能。
Martin Fowler:结构合理的软件能够更容易地进行调优。你应该首先专心于让软件结构合理、设计清晰,然后,在性能调优器的引导下,完成性能优化过程。


优化

Martin Fowler:还有一件事需要牢记:性能优化与版本和具体的实现是密切相关的。当你拿到 Java 的一个新版本时,一定要把以前所做的优化都撤消,然后重走一遍优化过程,以确保那些优化手段仍然奏效。通常你会发现,你为上一个版本的虚拟机 (virtual machine)或优化型编译器(optimizing compiler)所做的性能优化往往使当前的版本变慢,也即,之前的优化手段如今往往起到适得其反的作用。
Bill Venners:要记住以前为了提升性能都做了哪些改动可不是件容易的事情。
Martin Fowler:你必须这么做——先撤销,再重新应用。我知道这不容易。这就要求你对优化过程中所做的每个改动都要有详细的记录。要知道,旧的优化所造成的一些微不足道的性能损失,在新的版本下有时候可能会变得非常显著。
Craig Larman (拉曼 C [3]) 曾经讲过一个故事,我到现在都还很喜欢这个故事。Craig 有一次在 JavaOne 的大会上做性能优化的讲座。他提到了两个广为人知的技术:对象池(object pooling)和线程池(thread pooling)。对象池就是重用已有的对象,而不是每次都创建新的对象。线程池的原理基本类似。讲座结束后,有两个人来到 Craig 跟前。这两个人都是设计高性能虚拟机的。其中一个虚拟机是 Hotspot,另一个好像是 JRocket。一个人告诉 Craig,线程池的效果不错,但对象池则使得虚拟机的运行变慢;而另一个人告诉 Craig 的恰恰相反。
所以,你有可能在一种虚拟机上优化了性能,但拿到另一种虚拟机上,却减慢了其运行速度。对此,你要特别小心。对象池就是一个很好的例子。 很多人热衷于对象池,但起码有一半的情况下,人们并不去测量对象池的效果到底是好是坏。在 Java 的早期日子里,对象池非常重要,因为垃圾回收(garbage collection)功能还不是很完善。但在垃圾回收技术更新换代之后,对象池的效果就大大降低了,因为那些生存周期很短的对象可以被低成本地回收。只 有那些生存周期很长的对象,才适合使用对象池技术,因为对它们进行垃圾回收的成本很高。
从这里可以看出,规则也是在不断变化的。这就是为什么要对性能调优很仔细的原因所在。不要妄想根据源代码就能预测机器会做什么。当你与虚拟机或优化型编译器打交道时,性能调优是唯一的手段,因为编译器和虚拟机所做的事情,远远超出你的想象。记住,不要预测,要实测。


模式的意义

Bill Venners:你在《设计是否已死》这篇文章中表示:“对我来说,模式仍然是至关重要的,”尤其是考虑到极限编程的话。那么今天,模式处于一个什么样的地位呢?
Martin Fowler:模式给了我们瞄准的目标。我还会做一些预先设计。模式就是用来干这个的。模式还给了我们以重 构的目标。我们得以知道我们改进的方向。了解模式还有助于我们找到设计美感,因为模式至少都是一些好的设计。你可以从它们身上学到很多。因此,我仍然认为 模式起着重要的作用。其实,很多积极推动极限编程运动的人,本身就活跃在模式社区里。这两个社区在很大程度上是重叠的。


敏捷宣言

Bill Venners:最后一个问题,敏捷宣言到底是怎么一回事?
Martin Fowler:哦,那是一群投入到敏捷软件方法领域的人,聚在一起,彼此印证心得。这个领域包括极限编 程,scrum,crystal,修错驱动开发(fix-driven development),和动态系统开发方法(DSDM)。我们意识到我们之间有很多共同之处,因此决定把我们所认同的写下来。我们把这份宣言看作是一 种象征——在这面大旗下汇聚了支持此类方法的人们。在那次聚会中,我们决定使用“敏捷方法”这个词。这份宣言可以作为敏捷软件开发的一个定义。借助这份宣 言,我们共同呼吁,软件业的主流应该朝着这个方向前进。
Bill Venners:让我们来看看四条原则中的一条:“个人与交互重于过程和工具”。这是什么意思?
Martin Fowler:这条原则大意是说,与其借重过程和工具来加强对软件开发的管理,不如更多地关注于团队及其成员,关注于每个个体以及他们之间在个人层面上的交互。
Bill Venners:你是说提升他们的技能么?
Martin Fowler:要远比这个丰富得多。它包括了提升技能;它还包括要竭尽全力使程序员们身心愉悦,从而得以留 住人才;它还意味着更认真地对待个性冲突,注重人与人的相处,而不是试图找出某个完美的软件开发过程,然后要求大家都来遵守这个过程。我对这条原则的理解 是,应该是团队选择适合其的软件开发过程,而不是让团队来适应指定的开发过程。
尽管在那次聚会上,我们中的许多人都津津乐道于自己所采用的开发过程,并且我们当中的几个人还是软件工具销售商,但我们一致同意,对于一个项目的成功来说,软件开发过程和工具只是次要的因素,最主要的因素还是团队,是团队中的成员,是他们人性化的合作与努力。

分享到:
评论

相关推荐

    深入Java虚拟机(原书第二版)Bill Venners 著

    《深入Java虚拟机》是Java开发者必读的经典之作,由Bill Venners撰写。这本书以其深入浅出的方式,详尽地解析了Java虚拟机(JVM)的工作原理和内部机制,帮助开发者提升对Java程序运行时环境的理解,从而能够编写出...

    深入Java虚拟机(原书第二版清晰版) 中文版 Bill Venners PDF

    讲述java虚拟机 唯二的书。本书作者曾因本书荣获专业技术杂志《Java Report》评选的优秀作者奖,细心的读者可以从网上找到许多对本书第1版的赞誉。作者以易于理解的方式深入揭示了Java虚拟机的内部工作原理,深入...

    深入Java虚拟机 Bill Venners著 2003.09 P461.rar

    《深入Java虚拟机》是Bill Venners的经典之作,该书详细揭示了Java技术的核心——Java虚拟机(JVM)的内在运作机制。在2003年9月出版的这个版本中,作者深入浅出地阐述了JVM的架构和功能,帮助读者理解Java程序的...

    深入Java虚拟机第二版 Bill Venners著

    深入Java虚拟机,注意不是深入理解Java虚拟机。下载之前请考虑

    深入JAVA虚拟机第二版 Bill Venners著 曹晓钢 蒋靖译

    《深入JAVA虚拟机第二版》是由Bill Venners撰写,并由曹晓钢和蒋靖翻译的中文书籍。这本书是Java开发者必备的经典读物,它详细地解析了Java虚拟机(JVM)的工作原理,帮助读者深入理解Java程序的运行机制。尽管描述...

    Inside The Java Virtual Machine

    《深入理解Java虚拟机》是一本深度探讨Java技术体系核心的书籍,主要聚焦于Java虚拟机(JVM)的工作原理及其在程序执行过程中的关键作用。对于Java开发者来说,掌握JVM的知识是提升编程效率、优化性能、解决运行时...

    如何使用设计模式(中英文)

    本文将深入探讨设计模式的核心概念,并结合Bill Venners的观点,帮助你理解和运用这些模式。Bill Venners是一位知名的软件工程师和作家,他对设计模式的讨论虽然抽象,但却提供了深入理解这些模式的独特视角。 首先...

    在Scala中进行编程:全面的分步指南Programming in Scala: A comprehensive step-by-step guide

    这本书的独特之处在于它的共同作者是Scala语言的设计师Martin Odersky,同时还有Lex Spoon和Bill Venners参与编写。Martin Odersky是瑞士洛桑联邦理工学院(EPFL)的教授,也是Scala语言的创造者。Lex Spoon曾作为...

    深入Java虚拟机(第二版)

    《深入Java虚拟机(第二版)》是一本深入解析Java虚拟机(JVM)的权威著作,由专家Bill Venners撰写。这本书旨在帮助Java开发者理解JVM的内部工作机制,从而提升程序性能、优化内存使用并解决运行时问题。通过学习这...

    深入jvm虚拟机

    本书讲述了Java虚拟机一运行 所有Java程序的抽象计算机,还讲了几种与虚拟机密切相关的核心Java API。本书通过分析讲解、可运行的示例、参考资料和applet (它作为文中所述概念的交互式例示),提供了Java技术的深人...

    Programming in Scala

    2. 版权信息:书籍的版权归Martin Odersky、Lex Spoon和Bill Venners所有,首次作为PrePrint™ eBook在2007年发布,并在2008年出版。版权信息明确指出,未经Artima, Inc.事先书面许可,不得复制、修改、分发、存储、...

    深入Java虚拟机_Inside Java Virtual Machine

    Inside Java Virtual Machine by Bill Venners 中文PDF版

    Programming_In_Scala

    7zip format Programming in Scala, 2nd Edition, recommended by scala-lang.org. A comprehensive step-by-step guide by Martin Odersky, Lex Spoon, and Bill Venners

    C#首席架构师:版本控制、虚拟化和覆盖

    摘要:本文是Bruce Eckel和Bill Venners对C#首席架构师Anders Hejlsberg的采访,在本文中你将可以了解为什么C#默认声明是非虚拟化方法,而是采取和Java、C++中相反的解决方案,这一切跟版本控制以及方法覆盖有关系。...

    Programming in Scala, 2nd Edition

    by Martin Odersky, Lex Spoon, and Bill Venners This book is the authoritative tutorial on the Scala programming language, co-written by the language's designer, Martin Odersky. This second edition ...

    Programming.in.Scala.3rd.Edition

    Programming.in.Scala 第二版和第三版合集,作者 Martin Odersky / Lex Spoon / Bill Venners, 内容为全英文。 个人觉得写得不错,好过那本 Programming Scala (一词之差,封面是一只马来貘)

    scala 中文教程下载

    教程由Scala语言的设计者Martin Odersky及其团队成员Lex Spoon和Bill Venners共同编写,由Artima Press出版。 ### 二、作者简介 - **Martin Odersky**:Scala语言的主要设计者,同时也在瑞士洛桑联邦理工学院担任...

    scala编程电子书

    Scala语言由Martin Odersky、Lex Spoon和Bill Venners共同创立,并通过他们的公司Artima出版。Martin Odersky不仅是Scala语言的创始人,还担任瑞士洛桑联邦理工大学(EPFL)的教授;而Lex Spoon作为博士后,与Martin ...

Global site tag (gtag.js) - Google Analytics