《高效能程序员的修炼》一性能致胜

性能致胜

高效能程序员的修炼
在Stack Overflow和Stack Exchange上,我们总是非常强调性能。不仅仅因为我们是性能的发烧友(我很内疚),也因为我们认为速度是一个竞争优势。已经有大量的实验数据表明,网站载入和显示的速度越慢,使用它的人就会越少。

Google发现,显示10个结果的网页需要0.4秒来生成,显示30个结果的网页需要0.9秒来生成。半秒钟的延迟会造成20%的流量下降。半秒钟的延迟就扼杀了用户的满意度。

在A/B1测试中,亚马逊试着以100毫秒为单位逐步增加页面的延迟,结果发现即使是非常小的延迟也会付出高昂代价、导致收入显著下跌。

我相信反之亦然。那就是,你的网站越快,就会有越多的人来使用它。如果你像一个信息杂食动物那样思考,这是符合逻辑的:页面载入越快,你就能越快地判断出这个页面是否包含你所需要的内容。因此,你应该永远青睐速度快的网站。在开放的互联网上切换到不同的网站实际上不存在什么机会成本,而且无论你在找什么,那里总是有好些个网站提供类似的体验。于是,你如何把自己跟别人区别开来呢?你得从“快”入手,其他的先放一放。

你是否也感觉到了这个需求——对于速度的需求?如果是这样,我有3个建议想与你分享。

1.虔诚地遵循雅虎的指导原则
自2007年以来,构建一个快速网站的黄金参考准则始终首推雅虎提出的“加速你的网站的13条简单原则2”(英文原文为“Best Practices for Speeding Up Your Web Site”)。不过,这些准则附带了一条告诫:

这里有些不错的建议,但是,其中很多建议只有在你运营了一个每天有几百万独立用户访问的网站时才有意义。你是在运营一个像那样的网站吗?如果答案是肯定的,那你为什么不带着你高雅尊贵的老婆、乘着你的私人飞机去百慕大3群岛度假,还在这里读这个?

我不知该说什么好……自从我4年前写了那篇文章以后,在我身上发生了一件有趣的事情。我现在运营着一个由一系列面向公众、社区驱动的问答网站所组成的网络,而且的确每天有好几百万个独立用户在访问。(但我还没有私人飞机和高雅尊贵的老婆呢……)网站的规模确实是一个考虑因素,但是如果你在运营一个公众网站,你真的应该仔细研读雅虎的那个清单,并且对每一行都用心琢磨一遍。或者你还可以借助于一些工具:

我们在很久以前就已经实现了雅虎清单上的那13条原则中的绝大部分,除了有一条,而且是很大的一条:使用CDN(内容分发网络4)。

用户与你的网络服务器的邻近程度直接影响着响应时间。从用户的角度来看,把你的内容部署在多个地理位置分散的服务器上会让你的网页加载得更快。但是,你应该从哪里开始呢?

作为实现根据不同的地理位置来分发内容的第一步,请你不要尝试去重新设计你的网络应用程序以适应分布式架构。根据应用的不同,改变架构可能包括诸如同步会话(session)状态以及在不同位置的服务器之间复制数据库交易数据之类令人望而却步的任务。拉近你的内容和用户之间距离的尝试可能会被改变应用架构这一步延误,甚至永远也无法实现。

记住,有80%~90%的终端用户响应时间都花在下载网页的所有组件上:图片、样式表、脚本、Flash动画等。这个就是关于性能的“黄金法则”。与其从重新设计应用架构这样困难的任务入手,不如首先把你的静态内容分散部署。这样做的话,不仅在响应时间上的改进会更明显,它也能更好地利用CDN的优势使得实现起来更容易。

作为性能优化的最后一步,我们刚刚把我们所有的静态内容都部署到了CDN。结果很令人振奋!这里的参考基线是我们位于纽约市的数据中心。因此,下面这幅图应该被解读为:“我们的网站对于世界各个区域的用户来说,(在使用了不同的内容分发网络之后)速度提升了多少?”

从技术精确的角度来说,静态内容并不是决定性能的全部因素。你还是必须和我们在纽约市的服务器通信,以获得那些动态生成的内容——它们才是网页上真正有用的信息。但是,我们90%的访问者都是匿名的,而且只有36%的流量来自于美国。另外,雅虎的研究表明:有40%~60%的日常访问者的浏览器缓存是空白的。由此可见,针对世界范围内的访问优化利用这种“冷”缓存将带来巨大的效益。

现在,我不会推荐大家直接就上CDN。我宁愿把这一招留着晚一点再使用,因为在雅虎的清单上有一大堆改善性能的做法是免费而且很容易实现的。不过,自2007年以来,使用CDN的成本降低了很多,用起来也简便了很多。这要归功于有更多的公司参与了这个领域的竞争,它们包括亚马逊、NetDNA、CacheFly等。因此,当时机成熟的时候,而且你已经接受我的推荐虔诚地做完了雅虎清单上要求做的事情,你就可以考虑CDN了。

2.善待匿名用户和注册用户(并且为他们进行优化)
我们的问答网站致力于让互联网变得更好。这也是我们将用户贡献的所有内容在“创作共用5”的条款下重新授权回社区的原因所在。不论你是否登录,网站内容永远都是可见的。我鄙视那些用墙围起来的“花园”。事实上,你完全不需要登录就能参与我们的问答。完完全全不需要!

我们的流量主要来源于从搜索引擎或者其他一些地方来的匿名用户。这是典型的“一次创作——可能经过一些编辑——然后被人读上几百万次”的模式。然而,我们也在为热心的社区成员把网站做得更加丰富、富有活力(当然他们一定是登录的)。我们一直都在增加新的特性,这也意味着我们生成了更多的JavaScript和HTML。在每天都访问网站的用户和每个月或者每年只访问一次的用户之间,他们对网站内容的需求不可避免地存在着差异。

这两类用户都是非常重要的。但是,他们的需求有着根本性的不同。匿名用户一心只想快速浏览(获取内容),而我们热心的社区成员是推动网络进步的所有出色内容的创作者。这些小伙子们(和姑娘们)相互帮助;他们值得我们去特别对待。我们为两种类型的用户(匿名用户和登录用户)都精心设计并且为他们进行优化。下面,让我随机挑选一个关于超级用户的问题,我们一起来看看Google Chrome网络控制面板对这个问题的跟踪信息:

我们为匿名用户将HTML,CSS以及JavaScript的数据量降到了最小,这样他们获取网页的速度甚至(比登录的用户)更快。我们把非常基本的功能以存根的形式载入,并且动态地“激活”。举例来说,只有当用户把焦点放在答案输入区域时,编辑功能才会被激活。对于登录的用户而言,下载的数据量必然会大一些,但是我们也可以随意地为我们最热心的社区用户增加特性,而不必担心会影响为数众多但又一言不发的匿名用户的体验。

3.使性能成为一种(公开的)骄傲
到这里,我们已经把雅虎提出的性能指导原则“折腾”完了,并且确信我们为匿名用户进行了优化——我们到哪里还能找到提升性能的空间呢?当然是回到我们的代码。

对于网站的性能,有一个基本的宇宙法则是无法被绕过的:你永远不可能在服务器完成渲染之前发出一个网页。我知道,你可能很不屑。但是我要告诉你,在一段长时间的开发过程中(一年左右),你很容易就会忽略这里或那里的几百毫秒延时,而当有一天你回过头去看的时候,你会发现网页在服务器上的渲染几乎反常地花掉了整整一秒钟。在你的网页的第一个字节被传入网线之前,它居然要在“洞”里待上整整一秒钟——这是一个重大的缺陷!

这就不难理解:作为一名开发者,你要始终把每个页面的性能指标放在你的正前方。这也正是我们用MVC Mini Profiler(http://miniprofiler.com)所做的事情;我们还把它作为一个开源软件回馈给了这个世界。把渲染时间放在我们所发送的每个页面的右上角,这个简单的做法迫使我们去修正所有性能方面的退化和疏忽。

(值得注意的是,你可以点击上面的SQL链接来查看具体有什么操作被运行了,以及每一步所花的时间。你还可以点击share链接来把这次运行的分析数据分享给你的开发者同伴们,这样可以刺激他们去诊断某个特定的问题。这个工具还能处理多个AJAX请求。我有没有提到过,我们这个开源的MVC Mini Profiler简直棒极了?如果你是.NET平台上的开发者,你真的应该去试试。)

事实上,随着渲染时间显示在每一个页面上,并且团队里的每一位成员都能看到,性能就变成了一种骄傲。在很多地方我们只是粗心了点,或者疏忽了一些细微的东西,结果把网页搞得非常慢。大多数性能问题的修正都是微不足道的;即使是那些并不简单的修正,也给了我们极好的机会去重做架构设计,并帮我们所有的用户把事情变得更简单、更快速。

它起作用了吗?当然!就跟你钟爱的ILAsm6一样,它很有用!

这是Google 爬虫程序测出来的页面下载所需的时间——Google推出了一个实验性质的网站性能测试页面(如今已被撤销),号称可以完整地反映出全页面浏览器的载入时间——其数据印证了我们网站性能的提升。

虽然服务器端的页面渲染时间只是决定性能的众多因素中的一个,但它是你开始优化性能的基线。把页面的渲染时间显示在页面上这个简单的做法,实实在在地帮助我们(整个开发团队)构建了超快的网站——它的功劳我再三强调都不过分。相对而言,我们的网站总是快的。但纵然像我们这样向来以“快”见称的网站,在采取了这个简单的做法之后,我都感觉到了它为我们的性能带来的巨大提升。

我不想骗大家。提升性能并不容易。我们达到现在这个水准经过了一段很长而且很艰难的路,我们还花了很多钱去购买非常出色的硬件以运行我们所有的应用。不过,我认为我们的硬件选择还没有到特别奢侈的地步。郑重声明:我确实采纳了我自己的建议7。

我很清楚地记得在2000年的时候从AltaVista换到了Google,在很大程度上是因为Google太快了。对我而言,性能是一个特性(能助我克敌制胜)。我就是更喜欢使用快速的网站(而不是那些速度慢的网站)。自然而然,我要创建一个我自己想用的网站。在这里,我想我们还应该学到一个教训——在开放的互联网世界里竞争,最后只会剩下两种网站:要么很快,要么已经死去。

你将何去何从?

时间: 2024-09-09 11:11:55

《高效能程序员的修炼》一性能致胜的相关文章

《高效能程序员的修炼》一导读

译者序 高效能程序员的修炼出版社的冀康一开始来找我谈翻译这本书的时候,我的第一反应是:这兄弟真是不知道我现在有多忙!我每天要处理200多封邮件:在资源有限的情况下经常要同时带6-7个项目,而且每个项目的交付计划都很紧,压力很大:每天起码工作12个小时,有时候还要熬夜跟美国同事开会:周六基本上也是工作状态--我哪里还有空来翻译书?! 后来,当我了解到这本书的作者是Stack Overflow网站的创始人Jeff Atwood,还有书的内容实际上就是从作者的博客网站Coding Horror精选而来

读书笔记--《高效能程序员的修炼》

        初次邂逅......        最近小编抽空看了一本书,书的名字叫做<高效能程序员的修炼>,从这本书的名字就能看出来,软件开发远不只是写代码那么简单,你要学会的是高效能的工作,这让小编想到了去年读过的一本书<高效能人士的七个习惯>,有兴趣的小伙伴可以看看哦,受益匪浅,<高效能程序员的修炼>这本书从人文角度而非技术角度去阐释了作为一个程序员,应该具备的基本素质,所以小编在看这本书的过程中,感到非常的有共鸣,通俗易懂,又很贴近小逼啊工作和生活中的实际,

《高效能程序员的修炼》一向橡皮鸭求助

向橡皮鸭求助 高效能程序员的修炼 在Stack Exchange上,我们坚持要求提出问题的人需要在自己的问题上多下些功夫,而且我们在这方面有些偏执.那就是说,当你开始要提问题的时候,你应该: 用足够多的细节来描述发生的状况,这样我们可以顺着你的描述继续研究下去.即使在你所在的特定领域里我们并不是专家,你也要向我们提供必要的背景情况,这样我们可以了解到底发生了什么事情. 告诉我们你为什么需要知道答案.你怎么会出现在这里?是闲来无事的好奇,还是在某个项目里遇到了障碍?我们不是要求你长篇大论地讲生活故

《高效能程序员的修炼》一如何培养写作习惯

如何培养写作习惯 高效能程序员的修炼 我得忏悔一下:程序员同胞们,从某种程度上来说,我创办的Stack Overflow网站"耍"了大家. 在你找来棍棒准备揍我之前,请允许我先解释一下. 在过去的6年时间里,我越来越坚定地有了这样一个想法,那就是:成为一名杰出的程序员其实跟写代码没有太大的关系.做程序员确实需要一些技能,当然,还要有坚韧不拔的精神.但除此之外,更重要的还是要有良好的沟通技巧. 杰出的程序员跟勉强过得去的程序员之间的差别,不在于他们掌握了多少种编程语言,也不在于他们谁更擅

《高效能程序员的修炼》一大道至简

大道至简 高效能程序员的修炼 作者在Twitter上发的一条短讯: "你永远都有简化的空间." 11:29 AM – 2012-5-21 Rich Skrenta在"Code is our enemy"(代码是我们的敌人)一文中是这么说的: 代码不是什么好东西.代码会随着时间的推移慢慢腐烂.代码需要周期性的维护.代码里还藏有bug.新增功能意味着旧的代码需要被修改.你的代码越多,bug能藏身的地方就越多,迁出(checkout)或者编译的时间也就越长,新员工理解你的

《高效能程序员的修炼》一一路向前冲

一路向前冲 高效能程序员的修炼就运营Stack Overflow这个公司而言,我采用的商业策略全来自一个人,而且只有这一个人:Curtis Armstrong. 更准确地说,是Curtis Armstrong在1985年的经典荒诞青春喜剧<再见人生>(<Better Off Dead>)中所扮演的Charles De Mar.当他被问到如何从一个特别险峻的高山上滑雪下去的时候,他回答道: 沿着那条路下去,一定要快.如果有什么东西挡住了你的去路--绕开它! 在我们宣布Stack Ov

《高效能程序员的修炼》一磨刀不误砍柴工

磨刀不误砍柴工 高效能程序员的修炼作为一名软件开发人员,你该如何磨快你的锯子? "磨锯子"实际上是一个代名词,泛指一切编程以外的活动(不必编写代码),而这些活动(从理论上来说)能使你成为一名更出色的程序员.这个词源自于Covey的一本书:<高效能人士的7个习惯>(<The 7 Habits of Highly Effective People>).1 有个人在山间漫步,偶遇一位伐木工.他便停下来观察这位伐木工,看他热火朝天地锯一棵很大的树.他发现这位伐木工干得大

《高效能程序员的修炼》一学会读源代码

学会读源代码 高效能程序员的修炼在"沟通"这个复杂的领域里,写出能让人类领会并理解的连贯段落比敲出几行不至于让解释器或编译器"呕吐"的软件代码要难得多. 这就是为什么--就软件开发而言--所有的文档大概都是很差劲的.而且,由于为人写作比为机器写作要困难得多,恐怕在可预见的将来,文档还会继续差劲下去.对此,你基本上是无能为力的. 除了做一件事-- "卢克1,学着去读源代码." JavaScript"始终带有源代码"是一股革命性的

《高效能程序员的修炼》一关于多任务的神话

关于多任务的神话 高效能程序员的修炼在<质量·软件·管理:系统思维(第1卷)>一书中,Gerald Weinberg1提出了一个经验法则,用以计算由于切换项目而引起的浪费. 根据Weinberg的计算,哪怕在你的工作负荷中只是增加一个项目,也会严重地影响你的效率.你会损失20%的时间.当你增加第三个项目的时候,你会有将近一半的时间浪费在任务切换上面. 即便你同一时间只做一个项目,这种问题也可能会发生.轻易被电子邮件.电话以及即时消息打断你正在进行的工作,其影响可能是深远的,就像BBC2的这个研