对中国开发者最具吸引力的科技企业有哪些?快来为你 pick 的企业投票! 了解详情
写点什么

Java 性能优化的最差实践

2013 年 12 月 09 日

是的,你没有看错,是“最差实践”。关于 Java 性能优化的方法已经有很多文章讨论过,其中总有一些不值得提倡甚至应该杜绝的方法,需要让开发者时刻保持警觉。

Ben Evans 和 Martin Verburg 在 Java 性能优化方面有着丰富的实践经验,他们总结了一些“最差实践”。

“态度”的最差实践:

永远不要考虑所谓的可靠性、保障性、优雅、灵活架构、易理解,甚至不要去考虑正确性。最重要的是快速得到结果。谁关心你明天是不是对的?重中之重是尽快得到结果(任何结果)——如果你比别人快,你就可以定义什么是正确。聪明的开发者关注性能,而不是什么其它的东西。

“使用基准 (Benchmark)”的最差实践:

不要怀疑你在网上查到的基准——它怎么会有错呢?遵循这个基准,当然你也要清楚地认识到基准总是和现实世界中应用程序性能密切相连的(连维基百科都是这么认为的)。微基准(Microbenchmark)是最好的基准方式。微基准做起来很有趣,一旦你了解应用程序的底层细节行为之后,你可以很容易地依此进行推断,得到其余部分的性能表现。通过最好的微基准你可以发现 Java 虚拟机(JVM)在某些底层方面的性能表现上是有微妙的不同的——当聚合为一个整体时,这个结果是十分重要的。

“处理数据和结果”的最差实践:

“不要自我重复”(Don’t Repeat Yourself)原则是现代软件开发的重要组成部分。就性能而言,它意味着开发者不要进行多次性能测试。开发者还有很多其它开发工作要做,不把时间浪费在无聊的重复性能测试上是非常重要的。毕竟你是一个专业的开发者,你可以将测试设置的很完美然后通过一次测试就找到所有的 bug。

忽略那些所谓的“统计学意义”和“分布图”。这很可能是一群永远不能成为酷炫的“摇滚明星”的数学呆子提出来的。执行一次测试,测量均值(这里说的均值,就是对各值取平均),至此你就结束了对这些数据的分析。然后你就可以回归到一个性能工程师的真正工作——让你的应用程序中的每一个算法都发挥出它们最佳的性能。

测量事物是针对那些没有像你一样敏锐的洞察力的人而言的。是你开发的应用程序,所以你很了解问题都在哪里。算法优化是很难的,这也是专业人士花费时间的地方,不要去考虑收集和分析数据。

“优化算法”的最差实践:

你基本能判断出瓶颈的所在。相信你那惊人的分析技巧——这种技巧将引领你找出“罪魁祸首”,这些“罪魁祸首”的代码往往不是你写的。

幸运的是,优化别人的代码是容易的。首先,找到那些简单的、未优化算法的代码。理想的候选代码是包含长时间运行的循环,并在循环中设有条件检查的代码。谨记,一般例子的算法都是差劲的。你比其它人更了解你的数据集,因此你应该花足够的时间设计一个适合你的数据的算法。像你这样聪明、有才华的人设计出的算法一定远好于那些平庸的、凑合的教科书提供的实例。

不要担心设计算法会花费很多时间。这是实现性能优化过程中最重要的部分,并且想要做好它必须要像你这样的能人。

“优化 JVM”的最差实践:

你没有必要再在最新的 Java 版本上进行测试了,也没有必要追踪最小的版本号。你的程序在不同的 Java 版本间的表现不会有多少差异。

不过,通过设置传递给 Java 的参数配置,你可以让程序实现更好的性能。没必要为此去总结什么系统性的东西——你只需要找出你认为与问题有关的参数配置,然后随意调整他们直到达到最好的组合效果——更好的性能,而且没有额外的副作用。

在 JVM 中有一百多个性能优化配置。尽可能多的用吧。有些配置看似做的是相互冲突的、矛盾的事情,但别担心。像你这样的专业人士甚至是可以使用在 Java Hot Spot VM 源代码中的那些未加文档说明的配置。

“理解硬件”的最差实践:

理解 CPU 是件浪费时间的事情——而且这项工作应该留给硬件工程师。一个天才软件工程师不应该去考虑 L3 缓存的问题,也不应该去考虑数据是在内存中是如何存储的。

固态硬盘在所有情况下都跑的更快,所以一直使用它们。没必要去衡量实际吞吐量和其它可观察量。牢记,性能越高越好,因此多买些 RAM,并且扩展堆的大小。

“采纳性能建议”的最差实践:

性能建议就像美酒:随着时间的流逝,这个建议会变得更好,而且它永远不会过时。1990 年提出来的性能建议至今依旧是十分准确的。你应该深刻地认识到最初提出这些建议的工程师是一群多么卓越的人。他们很可能就是像你一样的人。

“和团队一起工作”的最差实践:

牢记,要谨慎地保管你的性能测试和成果。否则,其它人可能盗取你的劳动果实然后宣称是他们自己的。永远不要让他们独自审核你的工作。他们只会在你的工作上添乱,并且让你偏离你原本显而易见的正确结论。

更好的办法是让别人替你去做那些无聊的工作。如果有人已经做过了类似的工作,并且已经将自己的工作成果写在博文里或者 Stack Overflow 网站上了(特别是当他们有很高的信誉度时),采用他们的结论吧——这已经很够用了。毕竟,两个程序的表现能多大区别呢?毕竟都是 Java(或者都是 JVM)的,不是么?

不管是采用优化算法的办法还是采用新的又快又炫的技术,一旦你得到了如何提高性能的方法,你最好多用些时间“吓唬”你的同事,让他们接受你的方法,而不是浪费时间让他们独立检查你的结论。

无时不刻的提醒他们谁是老大,而且永远不要用文档说明或者解释你的原因——你最不想要的就是他们把你辛辛苦苦调整好的系统弄乱。

“检查技术”的最差实践:

当把应用程序框架当作一个整体来考虑时,永远记得密切关注最新的技术。如果你不能完全理解这项技术(牢记你是天才),那这项技术一定有什么地方不对。

特别提醒:这些最差实践的内容都是以反语的方式来叙述的,因此需要正确理解,尽量避免这些最差实践。

2013 年 12 月 09 日 04:513205
用户头像

发布了 501 篇内容, 共 214.0 次阅读, 收获喜欢 29 次。

关注

评论

发布
暂无评论
发现更多内容

产品 0 期 - 第二周作业

vipyinzhiwei

产品经理训练营

范文写作结构分析之“危险的分工”

JiangX

28天写作

产品质量战略

俊毅

2020出行之变(三):智能交通的星罗棋布

脑极体

农产品区块链溯源平台,区块链追溯系统

135深圳3055源中瑞8032

甲方日常 89

句子

工作 随笔杂谈 日常

基于Serverless实现静态博客访问统计功能

zFish

Serverless AWS Hugo Pulumi

【shell命令】关于mac的open命令

程序员架构进阶

工具 Shell 命令行 28天写作

阿里巴巴十亿级并发系统设计手册已开源(2021最新版)

比伯

Java 编程 架构 面试 计算机

boltdb源码阅读

行如风

go 数据库 源码剖析

在nodejs中创建child process

程序那些事

多线程 事件驱动 nodejs 并发 程序那些事

微信视频号的长视频和短视频 | 视频号28天(18)

赵新龙

28天写作

产品经理训练营 - 第二次作业

Jophie

产品经理训练营

2021,你值得看的华为/字节/腾讯/京东/网易/滴滴面经分享

比伯

Java 编程 架构 面试 计算机

区块链电子合同平台,区块链电子合同技术方案

135深圳3055源中瑞8032

Android硬编解码MediaCodec使用笔记

Changing Lin

android 音视频

Flink 中极其重要的 Time 与 Window 详细解析(深度好文,建议收藏)

五分钟学大数据

大数据 flink

精选算法面试-哈希表III

李孟

面试 算法

开发质量提升系列:checklist 投产检查列表(下)

罗小龙

代码质量 28天写作 checklist

CSS(四)——CSS高级特性

程序员的时光

CSS 程序员 七日更 28天写作

产品思维和意识

让我思考一会儿

给新春一台S,给用户三个S:华为智慧屏的新旅程

脑极体

合肥智慧平安小区建设,平安社区整体解决方案

135深圳3055源中瑞8032

第九周作业&总结

胡益

Serverless应用开发小记

zFish

DevOps AWS IaC #Serverless Terraform

项目管理文化建设

Ian哥

28天写作

没有女友的建议,不会有这家巨头公司

李忠良

28天写作

CSS(三)——简单的网页制作

程序员的时光

CSS 七日更 28天写作

Logi-KafkaManager开源之路:一站式Kafka集群指标监控与运维管控平台

张亮

Java 大数据 kafka 开源 消息队列

spring中那些让你爱不释手的代码技巧(续集)

Java架构师迁哥

同VLAN不同网段能否ping通

滴滴 Logi 日志管理与分析平台

滴滴 Logi 日志管理与分析平台

Java性能优化的最差实践-InfoQ