面试官:如何优化你的程序

48fef31f87e04380dd66c2371cef8e25.jpeg


关注&指标&度量,基础理论知识,工具&方法,最佳实践,参考资料


ee04fea850cabe5ddaf4c0bd50d04d26.jpeg


性能优化关注:CPU、内存、磁盘IO、网络IO等四个方面。


3b76d3be02f7e22cea53ad745f4e3cb4.jpeg


性能指标:吞吐率、响应时间、QPS/IOPS、TP99、资源使用率是我们经常关注的指标。


202417d43ba82847eecb3afa8e294aa6.jpeg


时间度量:从cpu cycle到网络IO,自上到下,时间量级越大。


ff9bba28c5e87610dc55557bbf1f66ba.jpeg


监控、分析、优化,三部曲,以终为始,循环往复。


ed6fe7e4577754b58a46083f7fc5f407.jpeg


优化性能,需要一些系统编程知识。


3f95f638fe2d955f0e7a7180300a28ef.jpeg


提升处理能力、减少计算量是优化的2个根本方向。


bda2d2a28626b28c7ba7932a9c0d35a3.jpeg


优化大师格雷格画的图,吊炸天,你应该很熟悉,gregg亲手实现了一些工具。


f1f7046f068d16863151d2e9a4547311.jpeg


借助工具定位性能瓶颈。gprof2dot.py可以处理多种采样输出数据

建议使用perf等非侵入式的profiling工具。


0541faa592afd42c2ba23cddcae6d1ee.jpeg


perf不仅仅可以定位cpu瓶颈,还可以查看很多方面,比如缺页,分支预测失败,上下文切换等。


73ce982293f14ee6c2a86294b6ccd442.jpeg


IO瓶颈,你应该知道的知识。


edc7bf5a014bed5db479ae64d5be5dbf.jpeg


有关锁的知识,你应该知道的。


cddbeda2cf3b6936d59bc4a4adac683d.jpeg


多线程的学问很大


1bd5939858cfc397da48818ee655839f.jpeg


内存管理的方方面面


21ae60e05deb92ca86169bdbc6d0eeda.jpeg


最佳实践,没有足够理由,你不应该违背。


4dd0752b51c59e88793c538967aa2b4c.jpeg


先学会前人宝贵的经验,才能创新。


ec2ebf7c3ce6203c6964f16716237cf7.jpeg


关于排序,你应该知道的。


c73800936c093b21a09308850ca6d6c1.jpeg

这些资料不错,你值得拥有。

一般性原则

依据数据而不是凭空猜测

这是性能优化的第一原则,当我们怀疑性能有问题的时候,应该通过测试、日志、profillig来分析出哪里有问题,有的放矢,而不是凭感觉、撞运气。一个系统有了性能问题,瓶颈有可能是CPU,有可能是内存,有可能是IO(磁盘IO,网络IO),大方向的定位可以使用top以及stat系列来定位(vmstat,iostat,netstat...),针对单个进程,可以使用pidstat来分析。

在本文中,主要讨论的是CPU相关的性能问题。按照80/20定律,绝大多数的时间都耗费在少量的代码片段里面,找出这些代码唯一可靠的办法就是profile,我所知的编程语言,都有相关的profile工具,熟练使用这些profile工具是性能优化的第一步。

忌过早优化

The real problem is that programmers have spent far too much time worrying about efficiency in the wrong places and at the wrong times; premature optimization is the root of all evil (or at least most of it) in programming.

我并不十分清楚Donald Knuth说出这句名言的上下文环境,但我自己是十分认同这个观念的。在我的工作环境(以及典型的互联网应用开发)与编程模式下,追求的是快速的迭代与试错,过早的优化往往是无用功。而且,过早的优化很容易拍脑袋,优化的点往往不是真正的性能瓶颈。

忌过度优化

As performance is part of the specification of a program – a program that is unusably slow is not fit for purpose

性能优化的目标是追求合适的性价比。

在不同的阶段,我们对系统的性能会有一定的要求,比如吞吐量要达到多少多少。如果达不到这个指标,就需要去优化。如果能满足预期,那么就无需花费时间精力去优化,比如只有几十个人使用的内部系统,就不用按照十万在线的目标去优化。

而且,后面也会提到,一些优化方法是“有损”的,可能会对代码的可读性、可维护性有副作用。这个时候,就更不能过度优化。

深入理解业务

代码是服务于业务的,也许是服务于最终用户,也许是服务于其他程序员。不了解业务,很难理解系统的流程,很难找出系统设计的不足之处。后面还会提及对业务理解的重要性。

性能优化是持久战

当核心业务方向明确之后,就应该开始关注性能问题,当项目上线之后,更应该持续的进行性能检测与优化。

现在的互联网产品,不再是一锤子买卖,在上线之后还需要持续的开发,用户的涌入也会带来性能问题。因此需要自动化的检测性能问题,保持稳定的测试环境,持续的发现并解决性能问题,而不是被动地等到用户的投诉。

选择合适的衡量指标、测试用例、测试环境

正因为性能优化是一个长期的行为,所以需要固定衡量指标、测试用例、测试环境,这样才能客观反映性能的实际情况,也能展现出优化的效果。

衡量性能有很多指标,比如系统响应时间、系统吞吐量、系统并发量。不同的系统核心指标是不一样的,首先要明确本系统的核心性能诉求,固定测试用例;其次也要兼顾其他指标,不能顾此失彼。

测试环境也很重要,有一次突然发现我们的QPS高了许多,但是程序压根儿没优化,查了半天,才发现是换了一个更牛逼的物理机做测试服务器。

如果对你有帮助,请帮忙转发,让更多朋友收益。

a4c9eb5b8c20087eeb2e8e7580ad025f.jpeg

Linux性能优化全景指南


1d0239331c4f0723ba68a7117902ce0c.jpeg

Linux调度系统全景指南(性能优化)


作者:头条 码砖杂役 侵权删


欢迎加入极客星球,分享多年工作经验和技术理解,扩展视野,直播分享,面试,作为大厂专业面试官,可以帮助想进各类大厂(芯片,自动驾驶,嵌入式,互联网等)的在校大学生制定学习路线和学习帮助,由于在各种类型公司都待过(华为->外企->到互联网大厂),在工作中想要普升和高薪的同学找到最佳学习和转型指导, 可以分享各种不同公司宝贵的职场工作经验, 项目经验,普升经验,希望大家站在前辈们的肩膀上(前期时间很宝贵,希望你们早点遇到自己的贵人),少走弯路,做得更好。详细点击查看-> 极客星球。最近大优惠100,用下面优惠劵,还能再减50。

8ac0a6883d624c2983df333c4032410a.png

5899790f7b2a0c90972e8bf7bde43a14.jpeg

IT工程师的成长路线

可以加我微信,交个朋友,技术交流

436f0555b73eecbfa6495748e2248c75.png

- END -


看完一键三连在看转发点赞

是对文章最大的赞赏,极客重生感谢你ebd637c7d7e921af3bf1baccce9f7648.png

推荐阅读

4a30ba8827dcc964c9ed34c2b9b58cb3.jpeg

定个目标|建立自己的技术知识体系


1d61153c8864ac39e332930b8d28035a.jpeg

大厂后台开发基本功修炼路线和经典资料

4631730a80d2e639735b40c79b9049a9.jpeg

难走的路,从不拥挤

你好,这里是极客重生,我是阿荣,大家都叫我荣哥,从华为->外企->到互联网大厂,目前是大厂资深工程师,多次获得五星员工,多年职场经验,技术扎实,专业后端开发和后台架构设计,热爱底层技术,丰富的实战经验,分享技术的本质原理,希望帮助更多人蜕变重生,拿BAT大厂offer,培养高级工程师能力,成为技术专家,实现高薪梦想,期待你的关注!点击蓝字查看我的成长之路

校招/社招/简历/面试技巧/大厂技术栈分析/后端开发进阶/优秀开源项目/直播分享/技术视野/实战高手等, 极客星球希望成为最有技术价值星球,尽最大努力为星球的同学提供面试,跳槽,技术成长帮助!详情查看->极客星球

                                                                                    感谢一键三连!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值