我通常交替使用向量/arraylist、hashmap/treemaps和其他java集合,但有时需要函数API要求(例如,在某些情况下可能需要排序数据集)。
然而,最近我发现,对于我正在运行的一些算法,我需要将java性能提高到极限。
是否有一套用于高性能数据结构的指南,可以用作编码的基本规则?
我正在寻找一般规则,但在这种情况下,对以下问题的回答也可能非常有用:
1)什么时候应该使用多维数组而不是嵌套集合? 2)向量与ArrayLists --真的存在性能差异吗? 3)集合API(如Google的集合)、java技巧(如反射和转换)以及其他常见的java开发人员习语是否会在JVM负载过重时减慢JVM的速度? 4)在进行大量计算时,原语与常规对象(即双对象和双对象)是否会降低JVM的速度? 5)在java程序中处理需要高性能的大型集合时,是否还有其他重要的指导方针?
发布于 2011-11-17 20:48:25
所有的性能问题都应该首先通过分析(时间和内存/对象的使用)来解决。不要优化那些不是影响代码性能的因素。有了这个警告,有一些一般的经验规则(这都应该通过剖析来测试!)
1)什么时候应该使用多维数组而不是嵌套集合?
如果您不需要对集合进行动态调整,并且不需要将数据提供给任何需要集合的内容,那么多维数组(实际上是数组数组)就会更快。
2)向量与ArrayLists --真的存在性能差异吗?
是。向量机中的许多方法是同步的,这是很昂贵的。如果您不是多线程,那么避免向量。即使是这样,同步的粒度通常也是错误的,最好自己提供线程安全。
3)集合API(如Google的集合)、java技巧(如反射和转换)以及其他常见的java开发人员习语是否会在JVM负载过重时减慢JVM的速度?
反射速度慢;垃圾收集速度慢。任何你能避免的事情都会加快速度。
4)在进行大量计算时,原语与常规对象(即双对象和双对象)是否会减慢JVM的速度?
是。自动装箱/取消装箱可以非常快地创建大量垃圾。这一切都必须收集,这也会减慢你的程序。
5)对于处理java程序中需要高性能的大型集合,还有其他重要的指导方针吗?
喜欢局部方法变量而不是字段访问。通过搜索网页,你可以找到许多其他的指导方针。不过,最重要的是要分析一下。
编辑:有一套很好的性能提示这里。
发布于 2011-11-17 20:39:51
要回答你是的话,双对双绝对会改变你的表演。
当您拥有由原语组成的集合时,当然可以使用由原语支持的集合,比如非常好的Trove。通过避免不断的原始对对象和反之亦然(Un)装箱,您节省了内存和宝贵的时间。
而且,到现在为止,向量类几乎已经成为过去了。
发布于 2011-11-17 20:46:02
1)如果您不需要真正的动态调整大小,或者您可以在一个足够小的“最大大小”容器中匹配您的数据,那么在从数组中随机访问时,您将比从集合中获得更好的性能,这是因为删除了方法调用开销,而且可能更多(取决于所使用的集合)。
2)在我看来,向量和哈希表几乎应该被看作是不受欢迎的。它们是“线程安全”,但是对于大多数真实的场景来说,仅仅让数据结构本身是线程安全是不够的;通常您的应用程序逻辑也必须是这种同步的一部分。ArrayList,HashMap会表现得更好,因为它们没有同步块,99.9%的时间都不会给您带来任何有用的东西。
3) Google的集合API很棒,没有真正的性能问题。反射绝对是缓慢的,不应该在内部循环中。
4)理想情况下,您希望避免对内部循环中的原语进行装箱/取消装箱。您可以找到专门调优到原语的集合(即。http://trove.starlight-systems.com/)。
5)这要视具体用途而定,我不会说有任何一般的指引。例如,当您将列表转换为一个集合或类似的东西时,请确保它不是在克隆您的整个集合。
https://stackoverflow.com/questions/8173938
复制相似问题