我相信这么良好的你
已经置顶了我
文/王栋
转自硅谷程序汪,已获作者授权,拒绝二次转载
一周前,我口试了一个来自WLabs的LeadBigDataEngineer,问了他一个题目:在一维数组里找满意条件的最宗子数组,很不幸,这个LeadEngineer在45分钟内连暴力解法都没有写出来,于是在竣事口试前五分钟,我打住了他。
他和我说:如今各人都在处理惩罚大数据,在Hadoop,Spark上跑程序,我们在这做算法题,优化程序的目标是什么?
我当时发急竣事口试,草草答复他说:我只是测试你的编程底子。
简直,从我13年开始工作到17年这四年,从内存里读1MB数据时间从15us降到6us;呆板学习算法从跑在64核CPU变成了$8000的NVIDIATeslaP100;Amazon服务器带宽从50MB提拔到了1GB。
硬件提拔云云迅猛,而我们还要在口试的时间举行白板测试,优化算法,提拔程序性能做什么?
程序的代价是什么?
有一天我和Uber的工程师??王聊代码,他开篇就说,我参加Uber前没见过那么屎的代码,但就是这个代码撑起了60B的共享经济帝国。
由此可见,程序的精美性只是写代码要思量的一个小题目,最紧张的是代码自身的代价。
很多时间优化程序性能并不紧张。假如你是一个Uber工程师,负责结账功能的体系计划,由于每秒必要处理惩罚的哀求并不多,以是要办理的题目的难度比微信红包,付出宝要简单不止一个数量级,在这种时间,思量程序的性能大概是多此一举。
闻名的Pareto'sLaw,应用到程序内里就是“20%的代码占用了80%的运行时间”。这个征象在互联网公司大概会更加极度-1%的代码占据了99%的运行时间。
说到这,我们可以得出如许一个结论:大部分的代码都是不必要思量性能优化大概存储优化的。
但是!
对于剩下的那么一小部分代码来说,优化黑白常紧张的,好的工程师能看到优化带去的经济代价,而不是仅仅停顿在优化代码的层面上。
好的优化是可以量化的
人们认识题目最直接的方式就是列数据,分析经济代价。
从正面来看性能优化是很值钱的,Apple网站上15寸的MacBookPro有两种型号,2.6GCPU要$2399,2.7GCPU要$2799。撤除不到$150的硬盘差价,你必要花10%更多的代价来得到字面上不到4%的性能提拔,而且这4%的性能还不肯定能从一样平常利用中表现出来。
从反证的角度来看,假如程序性能不紧张,我们用更快的电脑更短时间运行完程序并没有额外代价。那么一个拥有16核的服务器应该和一个拥有8核的服务器一样贵,但实际上Amazon的c4.4x代价刚好是c4.2x代价的两倍。
如今各人都在利用云服务,每个月的收费是根据你的存储空间利用和CPU斲丧利用盘算的,你的每一个优化都可以被转化成美金盘算出来。Buffer就发表过一篇工程师文章《HowWeSaved$132kaYearWithanITInfrastructureAudit》谈优化节省了多少经费。
另一种衡量方法就是去看用户多喜好你的产物。长期以来Microsoft的IE欣赏器不停是市场霸主,但近来已经被Google的Chrome欣赏器厥后居上了。在浩繁人们喜好用Chrome的缘故起因里,排名第一的就是Chrome的启动速率,网页加载速率远胜于其他欣赏器。
闻名的独角兽公司Pinterest也发过一篇Blog,谈一系列hack的方法是怎样将手机网页加载服从提拔了60%,与此同时带来了40%手机网页端用户转化率增长。
以是说,天下武功唯快不破。
加呆板并不是优化性能的良药
有的不懂技能的人有如许的认识误区,我们可以用加呆板,加内存,加CPU如许的方法加快程序,加大吞吐量。但哪怕Amadhl定律不束缚并行程序服从,让程序精确的运行在多核,多台呆板上也还是一个困难的题目。
投入更多的呆板是一种提拔性能的方法,但是既不自制,也不简单。
思量这么两种实际环境,一种是在单机上运行并行程序,最初我们可以从1core变成3core,将程序的性能提拔一倍,但是假如你还想再提拔一倍,那大概要16core,由于程序不得不面对多核带来的额外开销,兼容性和调试的困难性。
另一种环境是常见的搜刮引擎,当我们利用5台盘算机来举行搜刮时,整个集群的P95耗时由单机的P99耗时决定,当我们采取10台盘算机来搜刮时,固然每台盘算机处理惩罚的文档减半了,但整个集群的P95耗时变成了单机的P99.5耗时,说不定latency就从100ms变成了200ms。
如许看来,将单线程的代码性能进步一倍在某些环境下意味着更大的经济代价,增长更多的硬件并不是提拔性能的邪术,好的工程??才是。
那高级语言的性能怎么样?
有人说,本日最盛行的编程语言就是Python和Java了,但是他们的运行服从都比老牌语言C/C++差,这岂非不是一个程序服从不紧张的表现么?
我想要说,在你用着高级语言快速开辟的时间,无数的程序员都在想着帮你优化他们的运行服从。对于Python,有人研究Cython,有人研究Pypy,从底层优化Python的程序服从;对于Java,越来越多的公司都在通过优化它来优化网页速率,优化用户转化率,很多新的框架都在夸大服从提拔。
在你利用高级语言,写着更简单,更安全的代码时,你大概没有看到,在近来的十五年来,Java在欣赏器里的运行速率提拔了两个数量级,在BenchmarksGame的网站上,Node.js处理惩罚正则表达式之比C++慢3倍而已。
我们是不是也可以以为这些年来Java变得越来越盛行,一部分也是由于他的运行服从在不绝地提拔。假如Java还和从前一样慢,那估计如今没有什么人会继承利用了。
说到这里,我想向全部奋战在internaltools的同事致敬,他们固然很少实现面向用户的功能,但是他们实现的功能资助其他工程??节省了很多时间。
贪婪的程序员要求越来越高
尚有一个让人们忽视程序运行服从的因素就是闻名的Moore定律,处理惩罚器和存储读写会越来越快,谁还在意如今的程序服从呢?我们只必要用对的算法写干净的代码就可以了。
在1990年的时间,人们想让程序下国际象棋,当时候这是一个很困难的题目。你大概要在C++的代码里参加一些汇编代码举行优化,才华资助盘算机在短时间内做出决定。但是本日,你可以直接用Python写一个搜刮程序来下国际象棋,而且克服大部分人。
电脑一天一天的在变快,人们的需求也在一每天的变大,十几年前我们想让盘算机下国际象棋,下中国象棋,而且说下围棋是很难办理的题目,由于围棋的搜刮空间太大。但是如今我们已经可以用复杂的神经网络配上巨大的集群,打败每一个围棋大家。
同样的原理也可以用在手机上,手机性能每一年都在进步,我们对手机的利用需求也随着性能增长。读初中,高中的时间我只在手机上玩好坏的贪吃蛇游戏,如今我们则玩着3d的战略游戏,发送着语音下令...
可以想象,在不远的将来我们大概还会在手表上运行一些呆板学习程序,资助你做出一些决定,假如我们不优化我们代码的耗能,手机还能对峙12小时么?
优化是让处理惩罚器闲下来
末了一种说法,我们的处理惩罚器大部分时间处于空闲状态,纵然程序慢,我们也可以让CPU运行更长时间来补充。
回手这种想法只要打一个不得当的比方,你会以为买一个高级跑车但是长时间只放在车库里很傻么?
在筹划你的网站必要多么大的集群支持时,都会为他预备很多备用的盘算资源,要是不如许计划,运行程序就变成了去拥挤的超市里买菜,各人都在排着队,从停车场到收银台,排一整天。
我们也都履历过电脑CPU占用率到达100%的状态,呆板变热而且任何程序都不相应,你只能无奈的等着。
假如搜刮引擎的处理惩罚器在100%的状态下运行着,那么新来的哀求就会被放在队列里,导致更多处理惩罚器切换造成了额外的斲丧,终极服务器会彻底奔溃。
以是从计划的角度来看,我们必要我们的处理惩罚器处于空闲状态,有充足多余的盘算本领。
对程序的优化就是让处理惩罚器闲下来,更好的代码资助用户更快的得到结果,而且斲丧更少的资源。
结语
开了这么久脑洞,回到最初的口试。
我们有很多方法去衡量一个人,他是否对产物有正确的明白,他是否有创造力,他是否明白用户最必要的是什么。但假如单纯衡量程序员,我们可以由简单的两点看起,他的程序是否运行精确,他的程序是否高效。
好的程序员可以或许生产精确而且高效的代码,这个界说看起来很简单,但着实也是最难的。由于一旦你可以捐躯程序的精确性大概程序的服从,那很多题目都会变得更简单,就好像CAP理论里一旦放弃一个要求,就有很好的实现方案。
以是,在下次口试的时间不要放弃优化你的代码。
在这里偏重保举一个我喜好的blog,DanielLemire传授的《DoesSoftwarePerformanceStillMatter》,这是这篇文章整个骨干和灵感泉源,我只是在内里参加了更多个人感受。
课外资料:
https://lemire.me/blog/2017/03/20/does-software-performance-still-matter/
https://benchmarksgame.alioth.debian.org/u64q/compare.php?lang=nodelang2=gpp
https://overflow.buffer.com/2016/03/31/how-we-saved-132k-a-year-by-spring-cleaning-our-back-end/
https://medium.com/@Pinterest_Engineering/driving-user-growth-with-performance-improvements-cfc50dafadd7
作者先容
王栋
清华大学姚班07级,信息学比赛国际金牌。如今任职于硅谷电商网站Wish,专注搜刮保举算法及体系计划。曾任独角兽公司Pinterest搜刮排名负责人,领导团队计划和实现了高度可扩展的搜刮平台,以及呆板学习搜刮结果排名算法。
—————END—————
看完本文故意思?请分享给更多人
小搭档们,你怎么看!
我要评论