为什么我的HashMap实现比JDK慢10倍?

时间:2015-10-19 11:48:07

标签: java performance hashmap runtime

我想知道是什么产生了影响,我在编写代码时应该注意什么。

  • 测试时使用相同的参数和方法put()get() 没有印刷
  • 使用System.NanoTime()来测试运行时
  • 我尝试使用1-10个具有10个值的int键,因此每个哈希都返回唯一索引,这是最佳方案
  • 基于此的我的HashSet实现几乎与JDK的
  • 一样快

这是我的简单实现:

public MyHashMap(int s) {

    this.TABLE_SIZE=s;
    table = new HashEntry[s];

}

class HashEntry {

    int key;
    String value;

    public HashEntry(int k, String v) {
        this.key=k;
        this.value=v;
    }

    public int getKey() {
        return key;
    }

}



int TABLE_SIZE;

HashEntry[] table;

public void put(int key, String value) {

    int hash = key % TABLE_SIZE;

    while(table[hash] != null && table[hash].getKey() != key)
        hash = (hash +1) % TABLE_SIZE;

        table[hash] = new HashEntry(key, value);
}


public String get(int key) {

    int hash = key % TABLE_SIZE;

        while(table[hash] != null && table[hash].key != key)
            hash = (hash+1) % TABLE_SIZE;

            if(table[hash] == null)
                return null;
            else
                return table[hash].value;

}

以下是基准:

public static void main(String[] args) {


    long start = System.nanoTime();

    MyHashMap map = new MyHashMap(11);

    map.put(1,"A");
    map.put(2,"B");
    map.put(3,"C");
    map.put(4,"D");
    map.put(5,"E");
    map.put(6,"F");
    map.put(7,"G");
    map.put(8,"H");
    map.put(9,"I");
    map.put(10,"J");


    map.get(1);
    map.get(2);
    map.get(3);
    map.get(4);
    map.get(5);
    map.get(6);
    map.get(7);
    map.get(8);
    map.get(9);
    map.get(10);

    long end = System.nanoTime();

    System.out.println(end-start+" ns");


}

2 个答案:

答案 0 :(得分:4)

如果HashMap类的read the documentation,您会看到它实现了基于密钥hashCode的哈希表实现。如果地图包含非平凡数量的条目,假设合理的密钥分配在"桶中,则这比蛮力搜索更有效。它将条目分类为。

也就是说,对JVM进行基准测试的是non-trivial and easy to get wrong,如果您发现少数条目存在巨大差异,则可能很容易成为基准测试错误,而不是代码。

答案 1 :(得分:0)

当达到表现时,从不假设某事。

你的假设是“基于此的我的HashSet实现几乎和JDK一样快”。不,显然不是。

在进行表演工作时,这是一个棘手的部分:除非你已经非常精确地测量,否则一切都会受到质疑。更糟糕的是,你甚至测量过,测量结果告诉你实施的速度较慢;而不是检查你的来源,以及你正在衡量的东西的来源;你决定测量过程一定是错的......