本文是一个小工作总结。 总结这么久的性能优化经验。
有一次电话面试, 面试官说我简历里提到了性能优化, 他问我性能优化有什么章法吗?给他说说。
我当时真迷糊了。 真的,做了这么久的性能优化还真不知道性能优化有什么章法。
一直是自己凭感觉乱弄, 运气比较好, 还真的可以弄到点子上, 运行时间急剧缩短。
一提起优化, 大家第一反应就是算法。
不过说来惭愧, 我这种懒人, 对算法最一头雾水了, 算法导论买回来看了前几页就扔那压东西了,
现在好像还丢了。 不知道哪次搬家弄没了。
所以本文的主要核心就是如何在不懂算法的前提下, 进行性能优化。
从现在开始开启干货模式
===================================
提高性能的核心思想就是: 别犯二
1 别犯二之:少做没用的事情
最简单的一件事,
就只是让你写个函数:提取出最大的那个数。
你非写个排序算法出来然后选top 1, 你这不找抽吗。
就只是让你看字符串是否匹配正则表达式, 你非把正则表达式execute一次,连分组都提取完了然后一看说哦, 符合
这不是自找苦吃吗?
就只是让你生个孩子你非要找个帅哥结婚。。。。
哎, 不多说了。
2 别犯二之:少做“可扩展性”设计
第一次被教训是校园招聘的时候。 人家让写个函数, 输出所有小于10的5次方的数字。
我们写了个“返回M的N次方”的函数, 并且运算出个结果, 然后再去for循环。
结果我们全被刷了。
后来有人过了。
我们问它咋写的?
他说:for(int i = 0; i < 100000;i++).......
尼玛。
时刻记住:你做十次“可扩展性设计”,有九次是没用的。
还有一次会被后人重构一次, 然后才有用。
写出“容易重构”的代码就足以。 重构的人已经知道哪里需要“可扩展”了, 他们才是最适合做“可扩展性”的人。
哪怕这个人可能是未来的你。
3 别犯二之:别信测试数据,尤其是运行时间。
第一次接受教训是工作第一年, 公司内部一个讲座。
一个人写了个程序, 来证明StringBuilder比拼String更快。
然后写完了有个人站出来说, 你的结论虽然是对的, 但是你这个测试数据是不对的。 你每次拼string的时候都调用两次Console.WriteLine, 用StringBuilder的时候却用了一次, 你这实际上是作弊帮人家赢取比赛。
我们都有过这种经历吧:数学课, 证明题, 每个人都证明出来了, 但是有人得分有人不得分。
得分的同学过程大差不差, 做错的人则是千奇百怪, 但是神奇的是, 他们居然也能证明出这个结论。
充分证明了, 过程不靠谱, 结论才重要。 而测试数据, 就是个用于推导“谁更快”的过程。
4 别犯二之:别跟测试结果叫号。
这条看起来似乎和3冲突, 实际上。。。
有的时候确实有点冲突。
当测试结果说, 你这个性能有问题, 这时候大部分人的想法是:
你测错了吧?我的代码怎么会有问题。
当产生这个疑问的时候, 十有八九是你的代码有问题。
5 别犯二之:先做基础优化
做sql server查询优化连个索引都不加你优化个鬼啊!
做C#你连调用次数都统计不出来你优化谁啊?
做JavaScript优化你连全局变量都没搞定你还考虑什么性能啊!
基础优化做完可以解决90%的性能问题。
我在公司一直重复一句话:
给sql加索引可以解决90%的查询性能问题, 剩下10%的问题应该让DBA去处理。
6 别犯二之:转移压力
不要以为运行时间短才叫性能优化, 有的时候运行时间一秒不少, 让用户感觉快了, 也叫优化。
最典型的就是把JavaScript文件放到body的末尾。
有的人认为这是奇技淫巧, 但是实际上这相当有效。
如果你的JavaScript文件比较大, 可能需要一秒钟才能下载完, 那么在下载期间你的网页就是一片空白。
而放到结尾, 虽然还没下载完, 但是网页已经可以用了!
对于用户来说, 这就是快!
还有就是先把网页加载完, 图片和一些不重要的js在后台慢慢去load
这些都是出于相同的目的:让“感觉”变快。
7 别犯二之: 重复运算。
大部分所谓的优化只是去掉了重复运算的代码。
否则业务逻辑半点没删, 凭什么运行速度比以前快?
前人犯二, 后人填坑, 我们称之为优化而已。
举个例子, 我以前见过一个数据库导入导出的程序,
分别读取了来自新加坡的一个表, 澳大利亚的一个表, 还一个位于美国的表。
还进行了一堆运算, 然后由于网速很慢, 跑一次要一分钟。
这也是没办法的事情对吧?
可是他在一个for里面不断的做这个事情!
而后来的优化则相当让人喷饭。
程序员看了下, 表不大, 直接读出来放本地,
一下子搞定了一切。 运行时间从5个小时优化成了三分钟。
尼玛, 这不是坑爹吗。 这是做优化的程序员牛逼吗?
不是, 这是前人犯的二, 太严重。
总体先说这些。 因为我发现下班时间到了。