首页 存档 技术 查看内容

几个简单易学的 Java 性能优化技巧

2018-3-30 13:00 |来自: 互联网 352 0

摘要: 官方微博:动力节点 原文链接:https://blog.jooq.org/2015/02/05/top-10-easy-performance-optimisations-in-java/ 现在出现了很多关于流行语“网络规模“的宣传。人们使用大量时间,通过重新组织他们的应用架构 ...

官方微博:动力节点


原文链接:https://blog.jooq.org/2015/02/05/top-10-easy-performance-optimisations-in-java/


现在出现了很多关于流行语“网络规模的宣传。人们使用大量时间,通过重新组织他们的应用架构来获取系统“规模化”。


但是什么是规模化,我们应该怎样确定能够规模化?


规模化的不同方面


宣传中主要提到关于负载的规模化。比如,只要系统可以为 1 个用户工作,就能保证为 10 个用户、100 个用户或者成千上万的用户工作。想像一下,你的系统可以做到“状态无关”,那么少数真正保留的状态就能在网络中的任何处理单元进行传输和转换。如果负载是你的短板而延迟不是,那么个别需要 50-100ms 的请求就不会有问题。


另一个完全不同的方面是关于性能的规模化。比如,只要某个算法能处理 1 个信息片段,它就同样能处理 10个片段、100 个片段或成千上万个片段。这个类型的规模化最适合用大 O 符号[ 译者注:大O表示时间复杂度 ] 来描述。延迟是规模化性能的杀手。你想尽一切可能把所有计算放在一台机器上进行,这通常称为按比例扩大规模。


如果有免费的午餐 (并没有),我们可以无限度的联合扩展规模。先不管这个,今天我们要看看如何通过一些简单的事情改善性能。


大 O 符号


Java 7 的ForkJoinPool和 Java 8 的并行Stream有助于并行程序,如果你的 Java 程序发布在多核处理器的机器上,这会非常有用。与在网络中不同机器间的规模化架构相比,并行的优势在于它几乎可以完全消除延迟的影响,因为所有内核都能访问相同的内存。


但不要被并行计算的效果欺骗!一定要记住两件事情:


并行消耗核心。这对于批处理来说很好,但对异步服务器(比如 HTTP)简直就是噩梦。在过去的几十年中,我们有很好的理由来使用单线程 Servlet 模型。所以并行只对规模扩展有帮助。


并行不会对算法的大O符号产生影响。如果算法的时间复杂度是 O(n log n),让这个算法在 c 个核心上运行,时间复杂度会是 O(n log n / c),由于 c 在算法的复杂度中是一个微不足道的常量,你会节省一些时间,但不会降低复杂度。


提升性能最好的方式当然是减少复杂度。目标是获得 O(1) 或者接近 O(1) 的复杂度。当然,HashMap 查找就是一个例子。但这并不总是可能的,十分不易。


如果不能降低复杂度,仍然有可能调整有问题的算法来获得更好的性能,当然你得找到问题所在。假设下面是一个算法的图示:




这个算法整体的复杂度是O(N3),或者如果我们想处理个别的订单,复杂度是O(N x O x P)。不过,在分析这个代码的时候,你会发现一个有趣的现象:


在你的开发矩形中,左边的分支 (N -

声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

相关分类

返回顶部