使用 Java 构造高可扩展应用

来源:互联网 发布:好听的粤语 知乎 编辑:程序博客网 时间:2024/06/01 07:27

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

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

为什么性能没有增长?

多核能带来性能的大幅增长,这很容易通过简单的一些测试来观察到。如果我们写一个多线程程序,并在每个线程中对一个本地变量进行累加,我们可以很容易的看到多核和并行带来的成倍的性能提升。这非常容易做到,不是吗?在 参考资源 里我们给出了一个例子。然而,与我们的测试相反,我们很少在实际软件应用中看到这样完美的可扩展性。阻碍我们获得完美的可扩展性有两方面的因素存在。首先,我们面临着理论上的限制,其次软件开发过程中也经常出现实现上的问题。让我们看看 图 1 中的三条性能曲线:


图 1. 性能曲线
性能曲线

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

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

是什么造成了糟糕的可扩展性?





 

本文转自IBM Developerworks中国

      请点击此处查看全文


原创粉丝点击