为高性能数据结构定义一组基本规则(java)

jay*_*100 11 java collections performance guava

我通常可以互换地使用向量/ arraylists,hashmaps/treemaps和其他java集合,但有时存在功能API要求(例如,在某些情况下我可能需要排序数据集).

然而,最近,我发现需要将Java性能提升到我正在运行的某些算法的极限.

是否有一套高性能数据结构指南,我可以将其用作编码的基本规则?

我正在寻找一般规则,但在这种情况下,对以下问题的回答可能也非常有用:

1)什么时候应该使用多维数组而不是嵌套的集合?

2)向量与阵列列表 - 真的有性能差异吗?

3)集合API是否像谷歌的集合,java技巧(如反射和转换),以及其他常见的Java开发人员习惯用法在重载时往往会减慢JVM的速度?

4)在进行大量计算时,原语与常规对象(即Double vs double)是否会减慢JVM的速度?

5)在java程序中处理需要高性能的大型集合是否有其他重要的指导原则?

  • 注意:此时,我没有进行任何多线程...我意识到一旦开始并行化,就会有其他限制.

Ted*_*opp 9

应首先通过分析(时间和内存/对象使用)来解决所有性能问题.不要优化不影响代码性能的因素.有了这个警告,有一些一般的经验法则(应该通过分析测试!)

1)什么时候应该使用多维数组而不是嵌套的集合?

如果不需要动态调整集合大小并且不需要将数据提供给需要集合的任何内容,那么多维数组(实际上是数组的数组)可以更快.

2)向量与阵列列表 - 真的有性能差异吗?

是.Vector中的许多方法都是同步的,这很昂贵.如果您不是多线程,则避免使用Vector.即使你是,同步的粒度通常是错误的,你最好自己提供线程安全.

3)集合API是否像谷歌的集合,java技巧(如反射和转换),以及其他常见的Java开发人员习惯用法在重载时往往会减慢JVM的速度?

反思很慢; 垃圾收集很慢.你可以采取任何措施来避免这些事情.

4)在进行大量计算时,原语与常规对象(即Double vs double)是否会减慢JVM的速度?

是.自动装箱/拆箱可以非常快速地产生大量垃圾.这一切都必须收集,这也将减慢您的计划.

5)在java程序中处理需要高性能的大型集合是否有其他重要的指导原则?

首选本地方法变量进行字段访问.您可以通过搜索网络找到许多其他指南.但最重要的是要描述.

编辑:有业绩提示收集好这里.


Tac*_*der 8

回答你的问题4)是的,Double vs double肯定会改变表现

如果你有由基元组成的集合,你当然可以使用基元支持的集合,比如非常好的Trove API.通过避免不断的原始到对象和反之亦然(un)拳击,你可以节省内存和宝贵的时间.

此外,Vector类几乎已成为过去.