文档章节

Java 大法好,GC 保平安——关于性能权衡(tradeoff)的一些思考

国栋
 国栋
发布于 2017/04/26 16:41
字数 1488
阅读 1262
收藏 25

语言的鄙视链是一直存在的,有人会以自己使用的语言更灵活,更底层,效率更高而自豪乃至鄙视其它一些语言的使用者,比如 C 语言的使用者可能看不上 Java 语言的使用者。Java 之父有一次谈到了 Java 与 C 语言的对比,他是怎么说的呢?

从 C 语言的一个大问题说起

Java 语言之父 James Gosling(高司令) 在一次接受采访谈到 C 语言时说:

C 语言的一个大问题之一是:“一切都会尖叫着停止”,源于它们使用指针的方式……

"Everything comes to a screeching halt" is one of the big issues in C, because of the way that they do pointers.

image

图片来自 wiki,为挪威表现派画家爱德华·蒙克(Edvard Munch)的作品《尖叫》(The Scream

以上言论来自《编程之魂:与27位编程语言创始人对话》Java 部分:

image

可以在 china-pub 网上免费看到 Java 的这一章节:

http://images.china-pub.com/ebook195001-200000/196657/ch12.pdf

英文版参见:https://archive.org/stream/MastermindsOfProgramming/Masterminds%20of%20Programming_djvu.txt

看待性能的一个新角度

我们经常能看到一些对于 Java 语言性能的诘难,但如果你只是看到它失去了一些性能,却无视它因此得到了什么;又或者你只看到自己喜欢的语言有很好的性能,对于它因此失去了什么却视而不见,那么这样的对比是没有意义的。

关于性能,我曾经读到过一个很不错的观点,它来自于 MIT 公开课《算法导论》中那位光头佬教授。他是这么说的:

performance is like money, it’s like currency...performance is what you use to pay for user-friendliness,it’s what you pay for security...so that’s why you want performance, because you can use it to pay these other things that you want...

性能就像钱或者说货币那样……性能可以用来换取用户友好性,可以用于换取安全……所以这就是我们追求性能的原因,因为它可以用于换取一些其它我们想要的东西……

关于性能与体验的一个具体事例

的确,单独追求性能是没有什么意义的。比如,单纯地从 0.01 秒提升到了 0.001 秒,对于用户的感受来说,他是觉得没有什么区别的,都是“一眨眼”的事情,他的体验还是一样的,0.01 秒对于他已经是足够快了。

当然,这绝不是说,性能的提升是多余的。提升到 0.001 秒后,我们可以用这点性能交换(tradeoff)到一些东西。

比方说,原来是命令行窗口,现在就能上 GUI 的图形界面了。这样一来呢,性能又下降了,响应时间可能又从 0.001 秒降到了 0.01 秒,不过用户操作依然感觉很顺畅,但另一方面,从命令行到图形界面,用户体验却得到了极大提升。

从某种意义上说,我们“牺牲”了性能,换来了体验更好的用户界面。这种牺牲是值得的,也是我们想要的。

当然,它的前提是性能的提升。如果在 0.01 秒时就强行上图形界面,那么响应时间可能掉到了 0.1 秒,用户就可能觉察到卡顿了,虽然提升了体验,但操作的顺畅度却下降了,可能得不偿失。

所以,这就是所谓的性能的货币效应。

牺牲部分性能,Java 换来了什么?

那么,从 Java 语言的角度看,它也确实做了很多这种交换。

像垃圾收集(GC: garbage collection)这种就不必说了,可以使得用户从繁琐的内存管理中解脱出来。

又比如数组,Java 额外做了边界检查,牺牲了一些性能,但却使得程序更为安全。如果有人无视这一点而抨击它的性能不如一些语言,则显然是不公平的。

另一方面,许多没有这种检查的语言经常饱受溢出攻击的困扰。

有些人可能会对自己的技术能力有着盲目的自信,他们会说,“我们写的程序都是很严谨的,只有小白写的程序才会出问题。”

可是,他们真的能拍着胸脯说,他们写的程序永远都不会出问题吗?没有问题也许是暂时没有被频繁使用所以没有暴露,又或者是被攻击的价值不大,没人有兴趣去挖掘那些漏洞而已。

又或者说:“没有能力才会去依靠 Java 这种傻瓜的语言”。看到越来越多的菜鸟,甚至门外汉涌入编程世界,他们觉得有些不满又带有些不屑。

在我看来,这种情绪是没有必要的。软件的极大繁荣,却恰恰在于有越来越多简单的语言拉低了编程的门槛。

如果今天还在用汇编语言,以它的高门槛,很难想象我们今天打开手机就有如此丰富多彩甚至过剩的软件可用的局面。

至于说这些语言不够轻量,不够底层,效率不高?这些都不是问题,主不在乎,消费者不在乎,你的老板也不在乎。

我们已经说过,单纯的性能其实是没有意义的。如果我们不能综合地去看待,片面地纠结一个方面的问题,自然只会得出有失偏颇的结论。

© 著作权归作者所有

国栋

国栋

粉丝 376
博文 79
码字总数 154046
作品 0
东莞
程序员
私信 提问
加载中

评论(2)

国栋
国栋

引用来自“路飞”的评论

tradeoff,所以并没有绝对的公平与否或者优劣与否,全看交易双方当时的需要了
是这样,很多时候,架构就是关于平衡的艺术。
路飞
路飞
tradeoff,所以并没有绝对的公平与否或者优劣与否,全看交易双方当时的需要了
《成神之路-基础篇》JVM——JVM参数及调优(已完结)

Java内存模型,Java内存管理,Java堆和栈,垃圾回收 本文是[《成神之路系列文章》][1]的第一篇,主要是关于JVM的一些介绍。 持续更新中 JVM参数及调优 JVM实用参数系列 成为Java GC专家(5)...

2018/05/05
0
0
Java性能调优工程的几点建议

2016年8月,由极客邦、InfoQ和听云联合主办APMCon 2016 中国应用性能管理大会上,Java性能调优专家Monica Beckwith进行了《Java性能调优必读守则》(原题目:Java Performance Engineer's S...

紫魅编程
2016/10/11
487
3
《成神之路-基础篇》JVM——垃圾回收(已完结)

Java内存模型,Java内存管理,Java堆和栈,垃圾回收 本文是[《成神之路系列文章》][1]的第一篇,主要是关于JVM的一些介绍。 持续更新中 Java之美[从菜鸟到高手演变]之JVM内存管理及垃圾回收 ...

2018/05/05
0
0
即将改变软件开发的5个Java 9新特性

预计发布的Java 9中,最令人兴奋的特性是什么? 有关Java9的消息最近显得有些沉寂,不要被它迷惑了。JDK开发者正在努力朝着下一个版本迈进,计划2015年12月前完成所有功能开发。之后,它会经...

oschina
2015/07/22
14.7K
59
你必须知道的 5 个 JVM 命令行标志

本文是Neward & Associates的总裁Ted Neward为developerworks独家撰稿“你不知道5个……”系列中的一篇,JVM是多数开发人员视为理所当然的Java功能和性能背后的重负荷机器。然而,我们很少有...

yykj
2013/06/26
3.8K
20

没有更多内容

加载失败,请刷新页面

加载更多

texlive安装

Installing to: D:/bin/texlive/texlive/2019Installing [001/307, time/total: ??:??/??:??]: adobemapping [2130k]Installing [002/307, time/total: 00:03/08:57]: ae [84k]Installing......

MtrS
26分钟前
2
0
运维规范

命名规范 发布流程 监控告警 故障定位 状态 日志 监控

以谁为师
今天
2
0
约瑟夫环(报数游戏)java实现

开端 公司组织考试,一拿到考题,就是算法里说的约瑟夫环,仔细想想 以前老师将的都忘了,还是自己琢磨把~ package basic.gzy;import java.util.Iterator;import java.util.LinkedList;...

无极之岚
今天
3
0
Kernel字符设备驱动框架

Linux设备分为三大类:字符设备,块设备和网络设备,这三种设备基于不同的设备框架。相较于块设备和网络设备,字符设备在kernel中是最简单的,也是唯一没有基于设备基础框架(device结构)的...

yepanl
今天
3
0
Jenkins 中文本地化的重大进展

本文首发于:Jenkins 中文社区 我从2017年开始,参与 Jenkins 社区贡献。作为一名新成员,翻译可能是帮助社区项目最简单的方法。 本地化的优化通常是较小的改动,你无需了解项目完整的上下文...

Jenkins中文社区
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部