代码精进之路
范学雷
Oracle首席软件工程师,Java SE安全组成员,OpenJDK评审成员
立即订阅
6350 人已学习
课程目录
已完结 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讲)
结束语|如何成为一个编程好手?
代码精进之路
登录|注册

18丨思考框架:什么样的代码才是高效的代码?

范学雷 2019-02-13
如果让你设计一个有十亿用户使用的售票网站,你会考虑哪些问题?如果让你设计一个有一万亿用户使用的服务,你又会考虑哪些问题?不要以为有一万亿个用户的服务离我们很远,它正在快速地逼近我们。
我们前面讨论了,代码的性能是关于如何管理内存、磁盘、网络和内核等计算机资源的。该怎么衡量这些资源管理的好坏呢?这就需要一些评价指标。
这些指标不仅指导着代码的交付标准,也指导着我们编码时的技术选择。

用户的真实感受

最直接的指标就是用户的真实感受。用户的感受是我们软件开发最基本的风向标,当然也是代码性能追求的终极目标。
如果去超市买东西,我们享受的是购物的过程,讨厌结账。结账之所以令人讨厌,一小部分原因在于这时我们要付钱,更大的原因在于这个过程排队时间可能会很长。如果再算错了帐,就更让人不爽了。
用户对于软件性能的要求,和我们超市结账时的要求差不多:等待时间要短,出错的概率要小。
等待时间要短
这个概念很好理解。等待时间越短,我们越喜欢。最好是一点儿都感觉不到等待时间。使用“感觉”、“快”、“慢”这种词汇,有点主观了。有一种统计方法,被广泛地用来评价应用程序性能的满意度,它就是应用程序性能指数(Apdex)。
根据任务的响应时间,应用程序性能指数定义了三个用户满意度的区间:
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《代码精进之路》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(6)

  • 轻歌赋
    hashmap的默认大小的问题吗?
    个人感觉是这个原因,解决办法就是创建map时指定大小。
    另外hash的计算都是o1的时间复杂度,但是put这种写操作要比读操作慢。这个暂时没有想到替代方案。
    每次都要创建差值感觉比较慢,可以反过来查询当前值,存放差值。
    传入的数组不知道有没有序,但是可以默认有序,然后前后交换着访问。即先访问第一个,再访问最后一个,再访问第二个,反复进行
    两数之和不知道有没有负数参与的情况。
    个人感觉这个算法的时间复杂度已经是o1了,只能从其他角度考虑更快,空间复杂度偏大,考虑有序情况可以前后交换查找。但是无序情况没有帮助。
    当数据很大的情况下,可以考虑并行算法。
    这个问题的解法感觉最终的结果不应该是单个,可能有多组两数之和都满足的情况,程序设计个人感觉有点问题,实在是想不到更多了。欢迎大家和老师评论,目前还是实习阶段,经验难免不足,希望各位能够指出不足,共勉

    作者回复: 很厉害!最大的性能问题虽然还没有找到,但哪真的是时间积累的问题。你找的一些问题已经很有见地了,比如负数、有序、并行。比如按照我们的思考习惯,很难想到负数的问题,这里面有一个安全漏洞,我们第三篇接着聊。

    2019-02-13
    5
  • 苏志辉
    感觉剖异常比较耗性能,需要生成堆栈,可以返回空值

    作者回复: 是的,没有匹配的可以看作一个正常状况。返回空值(空数组),更好些。

    2019-03-15
    1
  • aguan(^・ェ・^)
    时间复杂度O(n),n表示数组的长度
    空间复杂度O(1)

    作者回复: 时间复杂度有三个,一个是for语句,一个是hashMap查询,一个是hashMap的put()。空间复杂度是hashMap占用的空间。你再分开来想想?

    2019-02-14
    1
  • Sisyphus235
    这个解法的算法已经比较完善了,如果要提升效率可能要从多线程、多进程的角度出发,这些也要和数据量相关,数据量小的时候可能排序的效果更好,因为线程和进程切换要损失效率
    2019-05-22
  • 王子瑞Aliloke有事电联
    很想有时间的时候自己试着开发一个浏览器;|
    但这个目标的是我考上研究生之后实施。

    作者回复: 嗯,期待!

    2019-03-05
  • 李星
    for循环时间复杂度可能是O(n),hashmap的put和containskey都是O(1)吧

    作者回复: 是的

    2019-02-17
收起评论
6
返回
顶部