Java 性能提示

2022-09-02 11:16:49

我有一个从C移植到Java的程序。这两个应用程序都使用快速排序来对某些分区数据(基因组坐标)进行排序。

Java版本运行速度很快,但我想让它更接近C版本。我正在使用Sun JDK v6u14。

显然,我无法与C应用程序相提并论,但我想了解我可以做些什么来尽可能合理地(在环境的限制内)获得尽可能多的性能。

我可以执行哪些操作来测试应用程序不同部分的性能、内存使用情况等?具体来说,我会怎么做?

另外,我可以实现哪些技巧(通常)来更改类和变量的属性和组织,从而减少内存使用量并提高速度?

编辑:我正在使用Eclipse,显然更喜欢任何第三方工具的免费选项。谢谢!


答案 1

不要试图超越jvm。

特别:

  • 不要为了性能而试图避免创建对象

  • 在适用的情况下使用不可变对象。

  • 正确使用对象的作用域,以便 GC 可以完成其工作。

  • 使用原语,其中你的意思是基元(例如,与可为空的整数相比,不可为空的int)

  • 使用内置算法和数据结构

  • 处理并发时,请使用 java.util.concurrent 包。

  • 正确性高于性能。首先正确进行测量,然后使用分析器进行测量,然后进行优化。


答案 2

显然,配置文件配置文件配置文件。对于Eclipse,有TPTP。这是一篇关于Eclipse的TPTPP插件的文章。Netbeans 有自己的分析器jvisualvm作为一个独立的工具很不错。(目前整个 dev.java.net 服务器似乎都已关闭,但它在很大程度上是一个活跃的项目。

首先要做的是使用库排序例程,Collections.sort;这将要求您的数据对象具有可比性。这可能足够快,并且肯定会提供一个很好的基线。

一般提示:

  • 避免使用您不需要的锁(您的JVM可能已经优化了这些锁)
  • 使用StringBuilder(不是StringBuffer,因为我刚才提到的那个锁)而不是连接对象String
  • 做任何你能做的事情;如果可能的话,让你的类完全不可变final
  • 如果您没有更改循环中变量的值,请尝试将其提升出来,看看它是否有所作为(JVM可能已经为您完成了此操作)
  • 尝试在ArrayList(甚至是数组)上工作,以便您正在访问的内存是连续的,而不是像LinkedList那样可能碎片化
  • 快速排序可以并行化;请考虑这样做(请参阅快速排序并行化)
  • 尽可能降低数据的可见性和实时时间(但不要扭曲算法来做到这一点,除非分析显示这是一个巨大的胜利)

推荐