道格·李(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.}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)