Redian新闻
>
面试官:如何优化你的程序?

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

公众号新闻


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





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




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





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





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





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





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





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





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

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





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





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





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





多线程的学问很大





内存管理的方方面面





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





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








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






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


一般性原则

依据数据而不是凭空猜测

这是性能优化的第一原则,当我们怀疑性能有问题的时候,应该通过测试、日志、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高了许多,但是程序压根儿没优化,查了半天,才发现是换了一个更牛逼的物理机做测试服务器。

来源:头条 码砖杂役
(版权归原作者所有,侵删)

微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
分享一道我之前遇到的面试题,面试官说答不出来正常面试时注意这些细节问题,面试官对你好感度暴增!Mock回顾 | Roblox面试官在线解析面试考点!绝了!反向面试经历 | 拿捏面试官全教程 附赠彩蛋1024程序员节,细数“改变世界”的程序员们依赖重、扩展差,字节跳动是如何优化Apache Atlas 实时消息同步的?持有多套房产是否成立公司节税?房产出租如何合法避税?资金来源是否牵连中国的资产?房产增值后如何优化配置,最大化合法不交税?范德堡大学招生官:如何填写活动列表?面试官:对不起,你的个人成长性与B端岗位不匹配【最后三天·优惠订阅】华为转型背后,中企如何适应世界新秩序?发糕面试官:百万数据的导入导出解决方案,怎么设计?阿里巴巴原首席人才官:如何打造强悍组织?跑步看世界-朴茨茅斯避免便秘,訓練你的腸道生物鐘面试官问:和上司意见不一致,你如何解决?咀外文嚼汉字(169)日本“助数词”(量词)招聘公司喜欢这样的程序员和产品经理10个 Python 脚本来自动化你的日常任务面试官:select......for update 会锁表还是锁行?我拴 Q 了!!对抗焦虑的9句箴言,送给很累很累的你如何优化一下医生的门诊工作流程?养只小狗,健康常有!研究:摸摸小狗有助于强化你的大脑10个Python脚本来自动化你的日常任务面试官:Hash 碰撞是什么?如何解决?被问懵了……面试官:为什么不建议在 MySQL 中使用 UTF-8 ?那个想学艺术的程序员,发现出路是律所加国RBC面试官:请推荐一本最近读过的书【健康】夏日入睡困难?C罗睡眠专家教你如何优化睡眠退休后的程序员,不会遇到太多经济困难?游戏咨询师分享:如何通过定价优化让你的内购收入提升40%?面试官:谈谈过滤器和拦截器的区别?面试官:你这数据库表设计的,真垃圾。。。10 个 Python 脚本来自动化你的日常任务面试官:电商库存扣减如何设计?如何防止超卖?
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。