Java性能提示

Ale*_*lds 19 java performance profiling

我有一个程序,我从C移植到Java.两个应用程序都使用快速排序来订购一些分区数据(基因组坐标).

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

显然我无法与C应用程序保持一致,但我想了解我能做些什么来尽可能地提高性能(在环境范围内).

我可以做些什么来测试应用程序的不同部分,内存使用情况等的性能?具体来说,我该怎么办?

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

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

And*_*son 32

不要试图超越jvm.

特别是:

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

  • 在适用的地方使用不可变对象.

  • 正确使用对象的范围,以便GC可以完成其工作.

  • 使用原语你指的是原语(例如,与可空的整数相比,非可空的int)

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

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

  • 对性能的正确性.首先做对,然后测量,然后用剖析器进行测量,然后进行优化.

  • 虽然你的许多建议可能都是真的,但我大胆地不同意第一个建议.在我的许多项目中,减少对象创建是优化的最重要部分.当然,保存10个大对象没有用,但通常最终会有数百万个小对象,而不是创建它们很重要. (22认同)
  • Andreas在很大程度上是正确的,在现代VM中对象分配非常快(例如,比C++快得多)并且假设它们不会长时间存在,它们将在次要集合中被清理.话虽如此,简介,简介,只做你有证据的事情,而不仅仅是因为有人这么说. (5认同)
  • @Brian:在Java 1.4中,一个对象的内存分配不到10个处理器指令.可移动的分代GC的神奇之处在于可用内存总是连续的,分配10个字节只是返回当前的空闲指针并将其递增10.相反,重用旧对象持有对可能更新的对象的引用将影响性能(可能强制内存移动) .那是'试图超越虚拟机'.根据您的对象定义和您使用的代码,您可以改善或恶化性能. (5认同)
  • 优于VM意味着尝试不尝试通过例如避免对象创建来提高性能.将这些优化留给编译器和VM.之后,也许连接一个分析器,如VisualVM/JProfiler,看看你的代码的哪些部分对你的程序的性能影响最大,然后集中精力改进它们. (3认同)

Han*_*Gay 11

显然,个人资料个人资料.对于Eclipse,有TPTP.这是一篇关于EclipseTPTP插件的文章.Netbeans有自己的分析器.jvisualvm作为一个独立的工具很好.(整个dev.java.net服务器目前似乎已经停止运行,但它非常活跃.)

首先要做的是使用库排序例程Collections.sort ; 这将要求您的数据对象是可比较的.这可能足够快,肯定会提供良好的基线.

一般提示:

  • 避免使用您不需要的锁(您的JVM可能已经优化了这些锁)
  • 使用StringBuilder(不是StringBuffer因为我刚刚提到的锁定事物)而不是连接String对象
  • 尽你所能final; 如果可能的话,让你的课程完全不可变
  • 如果你没有在循环中更改变量的值,请尝试将其挂出并查看它是否有所不同(JVM可能已经为您完成此操作)
  • 尝试处理一个ArrayList(甚至是一个数组),这样你访问的内存是连续的,而不是像它可能是一样的碎片.LinkedList
  • Quicksort可以并行化; 考虑这样做(参见quicksort并行化)
  • 尽可能减少数据的可见性和实时时间(但不要扭曲算法,除非分析显示它是一个巨大的胜利)


Rob*_*anu 5

使用分析器:

使用提供商提供的最新版本的JVM.顺便提一下,Sun的Java 6更新14确实带来了性能改进.

测量GC吞吐量并为您的工作负载选择最佳垃圾收集器.