Java ConcurrentHashMap在性能方面胜过HashMap?

Java ConcurrentHashMap在性能方面胜过HashMap?,第1张

Java ConcurrentHashMap在性能方面胜过HashMap?

道格·李(Doug Lea)在这些事情上非常擅长,因此,如果他的

ConcurrentyHashMap
表现一次超过约书亚·布洛赫(Joshua
Bloch)的表现,我不会感到惊讶
HashMap
。但是从Java 7开始,的第一个@author也
HashMap
已成为Doug
Lea。显然,现在没有任何理由
HashMap
比它的并表堂要慢。

出于好奇,我还是做了一些基准测试。我在Java
7下运行它。条目越多,性能越接近。最终

ConcurrentHashMap
在的3%之内
HashMap
,这非常了不起。俗话说,瓶颈是内存访问,“内存是新磁盘(而磁盘是新磁带)”。如果条目在高速缓存中,则两者都会很快。如果条目不适合缓存,则两者都会变慢。在实际的应用程序中,地图不必很大就可以与其他人竞争驻留在缓存中。如果经常使用地图,则将其缓存;如果不是,则不对其进行缓存,这才是真正的决定性因素,而不是实现(鉴于这两者都是由同一位专家实现的)

public static void main(String[] args){    for(int i = 0; i<100; i++)    {        System.out.println();        int entries = i*100*1000;        long t0=test( entries, new FakeMap() );        long t1=test( entries, new HashMap() );        long t2=test( entries, new ConcurrentHashMap() );        long diff = (t2-t1)*100/(t1-t0);        System.out.printf("entries=%,d time diff= %d%% %n", entries, diff);    }}static long test(int ENTRIES, Map map){    long SEED = 0;    Random random = new Random(SEED);    int RW_RATIO = 10;    long t0 = System.nanoTime();    for(int i=0; i<ENTRIES; i++)        map.put( random.nextInt(), random.nextInt() );    for(int i=0; i<RW_RATIO; i++)    {        random.setSeed(SEED);        for(int j=0; j<ENTRIES; j++)        { map.get( random.nextInt() ); random.nextInt();        }    }    long t = System.nanoTime()-t0;    System.out.printf("%,d ns %s %n", t, map.getClass());    return t;}static class FakeMap implements Map{    public Object get(Object key)    {        return null;      }    public Object put(Object key, Object value)    {        return null;      }    // etc. etc.}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5032295.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-15
下一篇 2022-11-15

发表评论

登录后才能评论

评论列表(0条)

保存