代码精进之路
范学雷
Oracle首席软件工程师,Java SE安全组成员,OpenJDK评审成员
立即订阅
6316 人已学习
课程目录
已完结 47 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 你写的每一行代码,都是你的名片
免费
第一模块:代码“规范”篇 (16讲)
01 | 从条件运算符说起,反思什么是好代码
02 | 把错误关在笼子里的五道关卡
03 | 优秀程序员的六个关键特质
04 | 代码规范的价值:复盘苹果公司的GoToFail漏洞
05 | 经验总结:如何给你的代码起好名字?
06 | 代码整理的关键逻辑和最佳案例
07 | 写好注释,真的是小菜一碟吗?
08 | 写好声明的“八项纪律”
09 | 怎么用好Java注解?
10 | 异常处理都有哪些陷阱?
11 | 组织好代码段,让人对它“一见钟情”
12丨组织好代码文件,要有“用户思维”
13 | 接口规范,是协作的合约
14 | 怎么写好用户指南?
15 | 编写规范代码的检查清单
16丨代码“规范”篇用户答疑
第二模块:代码“经济”篇 (14讲)
17 | 为什么需要经济的代码?
18丨思考框架:什么样的代码才是高效的代码?
19 | 怎么避免过度设计?
20 | 简单和直观,是永恒的解决方案
21 | 怎么设计一个简单又直观的接口?
22丨高效率,从超越线程同步开始!
23 | 怎么减少内存使用,减轻内存管理负担?
24 | 黑白灰,理解延迟分配的两面性
25 | 使用有序的代码,调动异步的事件
26 | 有哪些招惹麻烦的性能陷阱?
27 | 怎么编写可持续发展的代码?
28 | 怎么尽量“不写”代码?
29 | 编写经济代码的检查清单
30丨“代码经济篇”答疑汇总
第三模块:代码“安全”篇 (14讲)
31 | 为什么安全的代码这么重要?
32 | 如何评估代码的安全缺陷?
33 | 整数的运算有哪些安全威胁?
34 | 数组和集合,可变量的安全陷阱
35 | 怎么处理敏感信息?
36 | 继承有什么安全缺陷?
37 | 边界,信任的分水岭
38 | 对象序列化的危害有多大?
39 | 怎么控制好代码的权力?
40 | 规范,代码长治久安的基础
41 | 预案,代码的主动风险管理
42 | 纵深,代码安全的深度防御
43 | 编写安全代码的最佳实践清单
44 | “代码安全篇”答疑汇总
加餐 (1讲)
Q&A加餐丨关于代码质量,你关心的那些事儿
结束语 (1讲)
结束语|如何成为一个编程好手?
代码精进之路
登录|注册

17 | 为什么需要经济的代码?

范学雷 2019-02-11
如果你在线购买过春运的火车票,经历过购票网站的瘫痪,你应该深有体会,网站瘫痪是一件让人多么绝望的事情。
根据有关报道,2014 年 1 月 9 日,火车票售票网站点击量高达 144 亿次,相当于每个中国人点击了 10 次,平均每秒点击了 16,000 次,峰值的点击量可能远远超出 16,000 次。这么强悍的访问量,导致了火车售票网站多次瘫痪。这是一个典型的性能错配导致的重大网络事故,处理这么大的点击量需要特殊的程序设计和架构安排。
有句俗话说:“又要马儿跑,又要马儿不吃草。”马该怎么活呀?活不了呀!要想让马跑得快,既要有好马,也要有好料。
如果可以把软件比作一匹马的话,让这匹马出生时有一个优良的基因,平日里精心地伺候,是让它跑得快的先决条件。
前一段时间,我们讨论了如何让代码“写得又快又好、读得又快又好”的话题。接下来的这段时间,我们来聊聊怎么让代码“跑得又快又好”。跑得又快又好,一般也意味着更少的运营费用。该怎么让我们写的代码有一个跑得好的基因呢?

需不需要“跑得快”的代码?

很多项目是面向订单的,代码的功能是需要优先考虑的任务。这并没有错误。如果不能兼顾性能,这个债将来还起来会很痛苦,成本很高。而且,很多情况下,它是躲不开、赖不掉的。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《代码精进之路》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(19)

  • 王智
    自我表示还没成长到这一步,但是感觉性能问题是很重要,平常看微信公众号,掘金等知识文章会有很多关于性能出现问题造成的很严重的后果,还有很多如何提高性能的文章,从这点来看,性能确实是软件开发中很重要的点.
    就我现在的理解,只能感觉算法很重要,现在写代码都是只要能实现就行,能跑就行,没有考虑到其它,还得修改进步.
    加油,新的一年!!!

    作者回复: 后面我们会聊一些性能的问题,不同于算法的。

    2019-02-11
    4
  • 小狼
    示例代码是leetcode上两数之和的算法题,官方题解给出的一种答案。性能问题在于算法的时间复杂度和空间复杂度都是o(n)。该示例代码影响性能的最大因素就在于算法的时间辅助和空间复杂度可以再降一降,另外就是如果没有找到符合要求的两数,可以返回null,不必抛异常

    作者回复: 能分享下复杂度怎么再降一降吗?

    2019-02-18
    3
  • 卞雪达
    我最近遇到的一个性能问题。有一些数据是实时性要求不高的,我每次从数据库select的时候,都在想"这些货应该放缓存里",终于忍不住,弄了一个。我的需求很简单,每10分钟捞一次数据,加载在缓存里,应用从缓存里查。我自己用ConcurrentHashMap弄过简单的,但这次想用轮子。我用了Spring的缓存实现,可我发现这个实现并不支持定时,它希望我像管理数据库一样增改缓存。我觉得这样的话复杂度并不低,而且我将有两个应用,又暂时不打算上Redis这样的内存型存储,这种情况缓存的共享也是问题。我最终改造了一下Spring的缓存默认实现,记录上次查库的时间,再查时候判断下时间,超过10分钟就重新查,否则查缓存(我是单机,也就是内存),两个应用各存各的。老师,为什么轮子并不支持定时缓存,却希望我自己管理呢?定时这种事情是希望交给Redis这种缓存工具实在吗?

    作者回复: 我不了解Spring的设计机制。有了解的朋友们帮帮忙。

    2019-05-26
    2
    1
  • pyhhou
    像是结尾不应该抛出异常,还有 map 需要设置大小,不然会有频繁扩容的问题,另外就是一开始判断数组 nums 为 null 或者空的话可以直接返回空数组,这些我看前面的同学都说了。但是回看这个问题,往深了想,其实很多情况没有交代明白,其中一个我想到的就是内存的问题,这个示例算法的确很快,O(n)时间复杂度,但是也会有额外的 O(n) 的空间消耗,如果说数组 nums 非常非常的大,假如说是 100G,而此时的剩余内存不足 1G,这样子的话这种方法明显行不通;在这种极端情况下,仅仅从算法角度考虑的话,退而求其次的方法是将整个数组用快排排一下序,然后用双指针分别从数组两头相向走一遍,时间复杂度O(nlgn),空间复杂度O(1)。这也是验证了老师文章当中讲到的,考虑一个算法好坏与否,仅仅考虑算法本身是完全不够的,再精美的算法也需要结合计算机硬件,操作系统还有整体的一个架构进行考虑筛选~
    2019-03-03
    1
  • 鲸息
    还有一个难找的性能问题的话,我认为可能就是算法层面了。没有对数组进行任何处理就进行计算了,当数组很大时,可能会有很多不需要计算或者重复的。

    作者回复: 你也许已经找到了这个难找的问题了。重复的会带来什么问题?

    2019-02-15
    1
  • aguan(^・ェ・^)
    1.判断入参num数组为空时,直接返回空,这样就不用创建map
    2.当for循环结束后为找到满足条件的数据是返回空,而不是直接抛出异常

    作者回复: 找的好,这两点都影响性能。还有一些问题,留言区里有找到,后面的章节我们也会讨论到。

    2019-02-14
    1
  • 鲸息
    性能问题有两个:
    1. HashMap 没有指定大小,如果求组很大会导致频繁扩容
    2. 抛异常不太好,异常堆栈会有性能开销

    P.S.
    拆箱装箱在编译时就已经做了,不会有太大性能问题

    作者回复: 找的都对,这些都影响性能。还有一些问题,留言区里有讨论,我们后面的章节还会再讨论。

    2019-02-14
    1
  • Demon.Lee
    最后给出的代码性能问题是指 自动拆箱和装箱吗?老师可以在下一期里面给出解题思路么,谢谢

    作者回复: 拆箱/装箱有点影响,但是不是主要的。练手题我们最后都会解释的。

    2019-02-11
    1
  • 丁丁历险记
    认知的误解 不切实际的假设。
    2019-11-22
  • 丁丁历险记
    复杂度的来源,性能
    2019-11-22
  • qazwsx
    1.-XX:+ AutoBoxCacheMax增大Integer范围
    2.HashMap改用TreeMap
    2019-07-06
  • Sisyphus235
    代码的性能就是开发者的产品的质量,一般开发都会先要迅速开发出原型和 demo,这个时候无法顾及太多性能,但是要留有水平扩展的能力,或者性能开发的后续方案。

    比如方法解耦,留下异步的可能,再比如能够开多线程多进程,又或者能够留有接口提升核心算法的性能。
    2019-05-22
  • 陈杰
    用set应该就可以了,不需要用map。如果用加法可以不用保存结果,但时间复杂度相对弱一些
    2019-03-09
  • 悲劇の輪廻
    好的算法确实很重要,难怪说国外程序员应聘之前必先刷LC……
    2019-03-05
  • 秦凯
    对性能和资源消耗有一定的意识,但是具体的开发过程中或者应用运行过程中对性能进行监控、评测、分析就束手无策了。[捂脸]
    2019-03-01
  • 阳阳阳🌙
    nums.length 可以申明一个变量,不必每次循环都计算

    作者回复: nuns.length是一个变量,不是方法。

    2019-02-26
  • 鲸息
    再往底层虚拟机考虑的话,问题可能是 Integer 的缓存问题,导致大量重复对象创建,因为默认范围是 -128 到 +127

    作者回复: 没看明白-128到+127的说法。

    2019-02-15
  • Void_seT
    性能问题是出现在“入参数组过大,导致map频繁扩容”么?

    作者回复: 这是其中一个问题。这个练手题有多个性能问题,其中比较难找的一个,我们后面还会专门讨论。

    2019-02-13
  • hua168
    老师我有2个疑问:
    1.是不是编程学到一定程度下都要求学一下算法?一些常用用算法,我看极客专栏也有算法的文章
    2.我看很多小公司都没有用到什么多少算法之类,如果自己的目标是中小公司是不是不用学算法了?

    作者回复: 算法还是要有个概念的,大家应该都学过数据结构与算法吧?

    不过,算法太庞大驳杂了,我也不建议大家去钻研不常用的算法,比如加密算法的优化这种专业的东西。

    编程学到一定程度,我觉得是根据要解决的问题去找适合的技术。要是需要实现算法,那就一定要钻研算法;要是不涉及算法,也许你很快就会忘记学过的算法。这个和公司大小没关系,和你要做的事情有关系。

    2019-02-12
收起评论
19
返回
顶部