ConcurrentHashMap与Hashtable、Collections.synchronizedMap(map)比较

ConcurrentHashMap是对HashMap的高并发实现

压力测试方法:

/*
     * boolean retrieve : 是否获取,true获取和插入,false只插入
     */
    public static void pressureTest(final Map<String, Integer> map, int threshold, boolean retrieve) throws InterruptedException {
        System.out.println("Start pressure testing the map ["+map.getClass()+"] use the threshold ["+threshold+"],retrieve=" + retrieve);
        long totalTime = 0L;
        final int MAX_THRESHOLD = 2500000;
        for(int i = 0; i < 5; i++) {
            long startTime = System.nanoTime();
            ExecutorService executorService = Executors.newFixedThreadPool(threshold);
            
            for(int j = 0; j < threshold; j++) {
                executorService.execute(new Runnable() {
                    @Override
                    public void run() {
                        for(int i = 0; i < MAX_THRESHOLD; i++) {
                            Integer randomNumber = (int) Math.ceil(Math.random() * 600000);
                            if(retrieve) {
                                map.get(String.valueOf(randomNumber));
                            }
                            map.put(String.valueOf(randomNumber), randomNumber);
                        }
                    }
                });
            }
            
            executorService.shutdown();
            executorService.awaitTermination(2, TimeUnit.HOURS);
            long endTime = System.nanoTime();
            long period = (endTime - startTime) / 1000000L;
            System.out.println(threshold * MAX_THRESHOLD + " element insert/retrieved in " + period + " ms.");
            
            totalTime += period;
        }
        
        System.out.println("For the map ["+map.getClass()+"] the average time is " + (totalTime/5) + " ms.");
    }

main方法:

public static void main(String[] args) throws InterruptedException {
        /*
         *     比较在多线程中的性能差距
         * Start pressure testing the map [class java.util.Hashtable] use the threshold [5],retrieve=false
            2500000 element insert/retrieved in 1600 ms.
            2500000 element insert/retrieved in 1166 ms.
            2500000 element insert/retrieved in 1126 ms.
            2500000 element insert/retrieved in 1191 ms.
            2500000 element insert/retrieved in 1260 ms.
            For the map [class java.util.Hashtable] the average time is 1268 ms.
            Start pressure testing the map [class java.util.Hashtable] use the threshold [5],retrieve=true
            2500000 element insert/retrieved in 2411 ms.
            2500000 element insert/retrieved in 2412 ms.
            2500000 element insert/retrieved in 2450 ms.
            2500000 element insert/retrieved in 2393 ms.
            2500000 element insert/retrieved in 2470 ms.
            -----------------------------------
            For the map [class java.util.Hashtable] the average time is 2427 ms.
            Start pressure testing the map [class java.util.Collections$SynchronizedMap] use the threshold [5],retrieve=false
            2500000 element insert/retrieved in 1474 ms.
            2500000 element insert/retrieved in 1483 ms.
            2500000 element insert/retrieved in 1468 ms.
            2500000 element insert/retrieved in 1615 ms.
            2500000 element insert/retrieved in 1395 ms.
            For the map [class java.util.Collections$SynchronizedMap] the average time is 1487 ms.
            Start pressure testing the map [class java.util.Collections$SynchronizedMap] use the threshold [5],retrieve=true
            2500000 element insert/retrieved in 2379 ms.
            2500000 element insert/retrieved in 2339 ms.
            2500000 element insert/retrieved in 2393 ms.
            2500000 element insert/retrieved in 2347 ms.
            2500000 element insert/retrieved in 2358 ms.
            For the map [class java.util.Collections$SynchronizedMap] the average time is 2363 ms.
            -----------------------------------
            Start pressure testing the map [class java.util.concurrent.ConcurrentHashMap] use the threshold [5],retrieve=false
            2500000 element insert/retrieved in 965 ms.
            2500000 element insert/retrieved in 830 ms.
            2500000 element insert/retrieved in 660 ms.
            2500000 element insert/retrieved in 805 ms.
            2500000 element insert/retrieved in 605 ms.
            For the map [class java.util.concurrent.ConcurrentHashMap] the average time is 773 ms.
            Start pressure testing the map [class java.util.concurrent.ConcurrentHashMap] use the threshold [5],retrieve=true
            2500000 element insert/retrieved in 832 ms.
            2500000 element insert/retrieved in 779 ms.
            2500000 element insert/retrieved in 674 ms.
            2500000 element insert/retrieved in 778 ms.
            2500000 element insert/retrieved in 748 ms.
            For the map [class java.util.concurrent.ConcurrentHashMap] the average time is 762 ms.
            end...
            
            可以看出ConcurrentHashMap的效率最高
         */
        pressureTest(new Hashtable<String, Integer>(), 5, false);
        pressureTest(new Hashtable<String, Integer>(), 5, true);
        System.err.println("-----------------------------------");
        
        pressureTest(Collections.synchronizedMap(new HashMap<String, Integer>()), 5, false);
        pressureTest(Collections.synchronizedMap(new HashMap<String, Integer>()), 5, true);
        System.err.println("-----------------------------------");
        
        pressureTest(new ConcurrentHashMap<String, Integer>(), 5, false);
        pressureTest(new ConcurrentHashMap<String, Integer>(), 5, true);
        System.out.println("end...");
        
        /*
         *     比较在单线程中的性能差距
         * Start pressure testing the map [class java.util.Hashtable] use the threshold [1],retrieve=false
            2500000 element insert/retrieved in 1522 ms.
            2500000 element insert/retrieved in 838 ms.
            2500000 element insert/retrieved in 782 ms.
            2500000 element insert/retrieved in 844 ms.
            2500000 element insert/retrieved in 849 ms.
            For the map [class java.util.Hashtable] the average time is 967 ms.
            Start pressure testing the map [class java.util.Hashtable] use the threshold [1],retrieve=true
            2500000 element insert/retrieved in 1306 ms.
            2500000 element insert/retrieved in 1238 ms.
            2500000 element insert/retrieved in 1235 ms.
            2500000 element insert/retrieved in 1168 ms.
            2500000 element insert/retrieved in 1201 ms.
            -----------------------------------
            For the map [class java.util.Hashtable] the average time is 1229 ms.
            Start pressure testing the map [class java.util.Collections$SynchronizedMap] use the threshold [1],retrieve=false
            2500000 element insert/retrieved in 1189 ms.
            2500000 element insert/retrieved in 960 ms.
            2500000 element insert/retrieved in 1144 ms.
            2500000 element insert/retrieved in 1323 ms.
            2500000 element insert/retrieved in 1116 ms.
            For the map [class java.util.Collections$SynchronizedMap] the average time is 1146 ms.
            Start pressure testing the map [class java.util.Collections$SynchronizedMap] use the threshold [1],retrieve=true
            2500000 element insert/retrieved in 1273 ms.
            2500000 element insert/retrieved in 1319 ms.
            2500000 element insert/retrieved in 1000 ms.
            2500000 element insert/retrieved in 1222 ms.
            2500000 element insert/retrieved in 1319 ms.
            For the map [class java.util.Collections$SynchronizedMap] the average time is 1226 ms.-----------------------------------
            
            Start pressure testing the map [class java.util.concurrent.ConcurrentHashMap] use the threshold [1],retrieve=false
            2500000 element insert/retrieved in 1030 ms.
            2500000 element insert/retrieved in 1028 ms.
            2500000 element insert/retrieved in 857 ms.
            2500000 element insert/retrieved in 1194 ms.
            2500000 element insert/retrieved in 873 ms.
            For the map [class java.util.concurrent.ConcurrentHashMap] the average time is 996 ms.
            Start pressure testing the map [class java.util.concurrent.ConcurrentHashMap] use the threshold [1],retrieve=true
            2500000 element insert/retrieved in 1292 ms.
            2500000 element insert/retrieved in 1126 ms.
            2500000 element insert/retrieved in 1249 ms.
            2500000 element insert/retrieved in 1176 ms.
            2500000 element insert/retrieved in 1310 ms.
            For the map [class java.util.concurrent.ConcurrentHashMap] the average time is 1230 ms.
            -----------------------------------
            Start pressure testing the map [class java.util.HashMap] use the threshold [1],retrieve=false
            2500000 element insert/retrieved in 918 ms.
            2500000 element insert/retrieved in 912 ms.
            2500000 element insert/retrieved in 1109 ms.
            2500000 element insert/retrieved in 884 ms.
            2500000 element insert/retrieved in 991 ms.
            For the map [class java.util.HashMap] the average time is 962 ms.
            Start pressure testing the map [class java.util.HashMap] use the threshold [1],retrieve=true
            2500000 element insert/retrieved in 1066 ms.
            2500000 element insert/retrieved in 1327 ms.
            2500000 element insert/retrieved in 1103 ms.
            2500000 element insert/retrieved in 926 ms.
            2500000 element insert/retrieved in 1110 ms.
            For the map [class java.util.HashMap] the average time is 1106 ms.
            end...
            
            hashMap是现成非安全的,在单线程操作下性能并没有超出太多
         */
        pressureTest(new Hashtable<String, Integer>(), 1, false);
        pressureTest(new Hashtable<String, Integer>(), 1, true);
        System.err.println("-----------------------------------");
        
        pressureTest(Collections.synchronizedMap(new HashMap<String, Integer>()), 1, false);
        pressureTest(Collections.synchronizedMap(new HashMap<String, Integer>()), 1, true);
        System.err.println("-----------------------------------");
        
        pressureTest(new ConcurrentHashMap<String, Integer>(), 1, false);
        pressureTest(new ConcurrentHashMap<String, Integer>(), 1, true);
        System.err.println("-----------------------------------");
        
        pressureTest(new HashMap<String, Integer>(), 1, false);
        pressureTest(new HashMap<String, Integer>(), 1, true);
        System.out.println("end...");
    }

 

posted @ 2020-09-30 11:43  龙宇在天  阅读(199)  评论(0编辑  收藏  举报
//右侧添加目录 //增加页面点击显示24字社会主义核心价值观