java - 什么是最高效的 Java Collections 库?

标签 java collections

什么是最高效的 Java Collections 库?

几年前,我做了很多Java,当时的印象是trove是最好的(最有效的)Java Collections 实现。但是当我阅读问题“Most useful free Java libraries?”的答案时,我注意到 trove几乎没有提到。那么现在哪个 Java Collections 库最好呢?

更新:澄清一下,我主要想知道当我必须在哈希表等中存储数百万个条目时使用哪个库(需要小的运行时和内存占用)。

最佳答案

问题是(现在)关于存储大量数据的问题,这些数据可以使用诸如 int 之类的原始类型来表示。 ,在 map 中。在我看来,这里的一些答案非常具有误导性。让我们看看为什么。

我从 trove 修改了基准测量运行时和内存消耗。我还添加了 PCJ到这个基准,它是原始类型的另一个集合库(我广泛使用那个)。 '官方' trove 基准没有将 IntIntMaps 与 Java Collection 的 Map<Integer, Integer> 进行比较, 可能存储 Integers和存储ints从技术角度来看是不一样的。但是用户可能不关心这个技术细节,他想存储可以用 ints 表示的数据。高效。

首先是代码的相关部分:

new Operation() {

     private long usedMem() {
        System.gc();
        return Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
     }

     // trove
     public void ours() {
        long mem = usedMem();
        TIntIntHashMap ours = new TIntIntHashMap(SET_SIZE);
        for ( int i = dataset.size(); i-- > 0; ) {
           ours.put(i, i);
        }
        mem = usedMem() - mem;
        System.err.println("trove " + mem + " bytes");
        ours.clear();
     }

     public void pcj() {
        long mem = usedMem();
        IntKeyIntMap map = new IntKeyIntOpenHashMap(SET_SIZE);
        for ( int i = dataset.size(); i-- > 0; ) {
           map.put(i, i);
        }
        mem = usedMem() - mem;
        System.err.println("pcj " + mem + " bytes");
        map.clear();
     }

     // java collections
     public void theirs() {
        long mem = usedMem();
        Map<Integer, Integer> map = new HashMap<Integer, Integer>(SET_SIZE);
        for ( int i = dataset.size(); i-- > 0; ) {
           map.put(i, i);
        }
        mem = usedMem() - mem;
        System.err.println("java " + mem + " bytes");
        map.clear();
     }

我假设数据是原始的 ints ,这似乎是理智的。但这意味着 java util 的运行时惩罚,因为自动装箱,这对于原始集合框架来说不是必需的。

WinXP、jdk1.6.0_10 上的运行时结果(当然没有 gc() 调用):

                      100000 put operations      100000 contains operations 
java collections             1938 ms                        203 ms
trove                         234 ms                        125 ms
pcj                           516 ms                         94 ms

虽然这可能看起来很激烈,但这不是使用这样一个框架的原因。

原因是内存性能。包含 100000 int 的 map 的结果条目:

java collections        oscillates between 6644536 and 7168840 bytes
trove                                      1853296 bytes
pcj                                        1866112 bytes

与原始集合框架相比,Java 集合需要三倍以上的内存。 IE。您可以在内存中保留三倍的数据,而无需使用磁盘 IO,这会大大降低运行时性能。这很重要。阅读 highscalability找出原因。

根据我的经验,高内存消耗是 Java 最大的性能问题,这当然也会导致运行时性能更差。原始集合框架在这里可以提供真正的帮助。

所以:不,java.util 不是答案。在询问效率时,向 Java 集合“添加功能”并不是重点。此外,现代 JDK 集合“甚至胜过专门的 Trove 集合”。

免责声明:这里的基准测试远非完整,也不完美。这是为了让我明白这一点,我在许多项目中都经历过。原始集合足以容忍可疑的 API - 如果您使用大量数据。

关于java - 什么是最高效的 Java Collections 库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/629804/

相关文章:

java - 获取所有JtextField文本的简单方法

java - 元素类型 "servlet"的内容必须匹配“(icon?,servlet-name,display-name?,

Java:创建一个在文件中其他位置可识别的类

javascript - 将链式方法附加到 JavaScript 中的元素集合

java - JInternalFrame 不会出现在我的屏幕上

java - curl 和形式 - 不重定向到页面

java - 如何使用 IntStream 对 int 数组的特定索引数求和?

java - Android:AsyncTask.doInBackground 中可取消的 Java Collection 排序

java - 使用 Jackson 将列表序列化为 xml,无需注释?

c# - 集合在循环期间被修改,当它不可能是 C#