读书人

怎么提高Java 多线程应用性能(转)

发布时间: 2012-10-20 14:12:48 作者: rapoo

如何提高Java 多线程应用性能(转)

如何提高Java?多线程应用性能(转)

?

当 CPU 进入多核时代之后,软件的性能调优就不再是一件简单的事情。没有并行化的程序在新的硬件上可能会运行得比从前更慢。当 CPU 数目增加的时候,芯片制造商为了取得最佳的性能/功耗比,降低 CPU 的运行频率是一件非常明智的事情。相比 C/C++ 程序员而言 , 利用 Java 编写多线程应用已经简单了很多。然而,多线程程序想要达到高性能仍然不是一件容易的事情。对于软件开发人员而言, 如果在测试时发现并行程序并不比串行程序快,那不是一件值得惊讶的事情,毕竟,在多核时代之前, 受到广泛认可的并行软件开发准则通常过于简单和武断。

在本文中,我们将介绍提高 Java 多线程应用性能的一般步骤。 通过运用本文提供的一些简单规则,我们就能获得具有高性能的可扩展的应用程序。

?

作为追求完美的软件工程师,我们希望看到随着线程数目的增长程序的性能获得线性的增长,也就是图 1 中的蓝色直线。而我们最不希望看到的是绿色的曲线,不管投入多少新的 CPU,性能也没有丝毫增长。(随着 CPU 增长而性能下降的曲线在实际项目中也存在)。而图中的红色线条则说明通常的 90-10 法则并不适用于可扩展性方面。假设程序中有 10% 的计算只能串行进行,那么其扩展性曲线如红线所示。由图可见,当 90% 的代码可以完美的并行时,在 10 个 CPU 存在的情况下,我们也只能获得大约 5 倍的性能。如果任务中具有无法并行的部分,那么在现实世界,我们的性能曲线大致上会位于图 1 中的灰色区域。

在这篇文章中,我们不会试图挑战理论极限。我们希望能解释一个 Java 程序员如何能够尽可能的接近极限,这已经不是一个容易的任务。

?

在上图中,蓝色的曲线是一个基于 Lock 的老式日志服务器,而绿色的曲线是我们进行了性能调优之后的日志服务器。可以看到,LogServerBad 的性能随线程数目的增加变化很小,而 LogServerGood 的性能则随着线程数目的增加而线性增长。如果不介意使用第三方的库的话,那么来自 Project KunMing 的 LockFreeQueue 可以进一步提供更好的可扩展性:


图 3. 使用 Lock-free 的数据结构
怎么提高Java 多线程应用性能(转)?

在上图中,第三条曲线表示用 LockFreeQueue 替换标准库中的 ConcurrentLinkedQueue 之后的性能曲线。可以看到,如果线程数目较少时,两条曲线差别不大,但是单线程数目增大到一定程度之后,Lock-Free 的数据结构具有明显的优势。

在下文中,将介绍在上述例子中使用的可以帮助我们创建高可扩展 Java 应用的工具和技巧。

使用 JLM 分析应用程序

JLM 提供了 Java 应用和 JVM 中锁持有时间和冲突统计。具体提供以下功能:

读书人网 >编程

热点推荐