zoukankan      html  css  js  c++  java
  • ConcurrentSkipListMap VS ConcurrentHashMap

    ConcurrentSkipListMap 与 ConcurrentHashMap进行比较

    package com.dwz.concurrent;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import java.util.concurrent.ConcurrentHashMap;
    import java.util.concurrent.ConcurrentSkipListMap;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.TimeUnit;
    import java.util.concurrent.atomic.AtomicInteger;
    
    public class ConcurrentSkipListMapVSConcurrentHashMap {
    	static class Entry{
    		int threshold;//线程数
    		long ms;//运行的平均时间
    		public Entry(int threshold, long ms) {
    			this.threshold = threshold;
    			this.ms = ms;
    		}
    		
    		@Override
    		public String toString() {
    			return "Count:" + threshold + ",ms:" + ms;
    		}
    	}
    	
    	public static void pressureTest(final Map<String, Integer> map, int threshold) throws InterruptedException {
    		System.out.println("Start pressure testing the map ["+map.getClass()+"] use the threshold ["+threshold+"]");
    		long totalTime = 0L;
    		final int MAX_THRESHOLD = 500000;
    		for(int i = 0; i < 5; i++) {
    			final AtomicInteger counter = new AtomicInteger(0);
    			map.clear();
    			long startTime = System.nanoTime();
    			ExecutorService executorService = Executors.newFixedThreadPool(threshold);
    			
    			for(int j = 0; j < threshold; j++) {
    				executorService.execute(() -> {
    					for(int x = 0; x < MAX_THRESHOLD && counter.getAndIncrement() < MAX_THRESHOLD; x++) {
    						Integer randomNumber = (int) Math.ceil(Math.random() * 600000);
    						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(MAX_THRESHOLD + " element insert/retrieved in " + period + " ms.");
    			
    			totalTime += period;
    		}
    		
    		summary.get(map.getClass()).add(new Entry(threshold, (totalTime/5)));
    		System.out.println("For the map ["+map.getClass()+"] the average time is " + (totalTime/5) + " ms.");
    	}
    	
    	private final static Map<Class<?>, List<Entry>> summary = new HashMap<Class<?>, List<Entry>>() {
    		{
    			put(ConcurrentHashMap.class, new ArrayList<>());
    			put(ConcurrentSkipListMap.class, new ArrayList<>());
    		}
    	};
    	
    	public static void main(String[] args) throws InterruptedException {
    		for(int i = 10; i < 100;) {
    			pressureTest(new ConcurrentHashMap<>(), i);
    			pressureTest(new ConcurrentSkipListMap<>(), i);
    			i += 10;
    		}
    		
    		summary.forEach((k, v) -> {
    			System.out.println(k.getSimpleName());
    			v.forEach(System.out::println);
    			System.out.println("=============================");
    		});
    	}
    }
    

      代码执行结果:

    Start pressure testing the map [class java.util.concurrent.ConcurrentHashMap] use the threshold [10]
    500000 element insert/retrieved in 480 ms.
    500000 element insert/retrieved in 167 ms.
    500000 element insert/retrieved in 315 ms.
    500000 element insert/retrieved in 107 ms.
    500000 element insert/retrieved in 130 ms.
    For the map [class java.util.concurrent.ConcurrentHashMap] the average time is 239 ms.
    Start pressure testing the map [class java.util.concurrent.ConcurrentSkipListMap] use the threshold [10]
    500000 element insert/retrieved in 783 ms.
    500000 element insert/retrieved in 641 ms.
    500000 element insert/retrieved in 712 ms.
    500000 element insert/retrieved in 643 ms.
    500000 element insert/retrieved in 558 ms.
    For the map [class java.util.concurrent.ConcurrentSkipListMap] the average time is 667 ms.
    Start pressure testing the map [class java.util.concurrent.ConcurrentHashMap] use the threshold [20]
    500000 element insert/retrieved in 619 ms.
    500000 element insert/retrieved in 120 ms.
    500000 element insert/retrieved in 126 ms.
    500000 element insert/retrieved in 138 ms.
    500000 element insert/retrieved in 129 ms.
    For the map [class java.util.concurrent.ConcurrentHashMap] the average time is 226 ms.
    Start pressure testing the map [class java.util.concurrent.ConcurrentSkipListMap] use the threshold [20]
    500000 element insert/retrieved in 520 ms.
    500000 element insert/retrieved in 638 ms.
    500000 element insert/retrieved in 535 ms.
    500000 element insert/retrieved in 537 ms.
    500000 element insert/retrieved in 539 ms.
    For the map [class java.util.concurrent.ConcurrentSkipListMap] the average time is 553 ms.
    Start pressure testing the map [class java.util.concurrent.ConcurrentHashMap] use the threshold [30]
    500000 element insert/retrieved in 279 ms.
    500000 element insert/retrieved in 121 ms.
    500000 element insert/retrieved in 127 ms.
    500000 element insert/retrieved in 131 ms.
    500000 element insert/retrieved in 122 ms.
    For the map [class java.util.concurrent.ConcurrentHashMap] the average time is 156 ms.
    Start pressure testing the map [class java.util.concurrent.ConcurrentSkipListMap] use the threshold [30]
    500000 element insert/retrieved in 513 ms.
    500000 element insert/retrieved in 537 ms.
    500000 element insert/retrieved in 509 ms.
    500000 element insert/retrieved in 548 ms.
    500000 element insert/retrieved in 512 ms.
    For the map [class java.util.concurrent.ConcurrentSkipListMap] the average time is 523 ms.
    Start pressure testing the map [class java.util.concurrent.ConcurrentHashMap] use the threshold [40]
    500000 element insert/retrieved in 182 ms.
    500000 element insert/retrieved in 124 ms.
    500000 element insert/retrieved in 129 ms.
    500000 element insert/retrieved in 126 ms.
    500000 element insert/retrieved in 122 ms.
    For the map [class java.util.concurrent.ConcurrentHashMap] the average time is 136 ms.
    Start pressure testing the map [class java.util.concurrent.ConcurrentSkipListMap] use the threshold [40]
    500000 element insert/retrieved in 526 ms.
    500000 element insert/retrieved in 558 ms.
    500000 element insert/retrieved in 524 ms.
    500000 element insert/retrieved in 598 ms.
    500000 element insert/retrieved in 557 ms.
    For the map [class java.util.concurrent.ConcurrentSkipListMap] the average time is 552 ms.
    Start pressure testing the map [class java.util.concurrent.ConcurrentHashMap] use the threshold [50]
    500000 element insert/retrieved in 166 ms.
    500000 element insert/retrieved in 128 ms.
    500000 element insert/retrieved in 143 ms.
    500000 element insert/retrieved in 132 ms.
    500000 element insert/retrieved in 120 ms.
    For the map [class java.util.concurrent.ConcurrentHashMap] the average time is 137 ms.
    Start pressure testing the map [class java.util.concurrent.ConcurrentSkipListMap] use the threshold [50]
    500000 element insert/retrieved in 485 ms.
    500000 element insert/retrieved in 535 ms.
    500000 element insert/retrieved in 503 ms.
    500000 element insert/retrieved in 549 ms.
    500000 element insert/retrieved in 589 ms.
    For the map [class java.util.concurrent.ConcurrentSkipListMap] the average time is 532 ms.
    Start pressure testing the map [class java.util.concurrent.ConcurrentHashMap] use the threshold [60]
    500000 element insert/retrieved in 224 ms.
    500000 element insert/retrieved in 137 ms.
    500000 element insert/retrieved in 151 ms.
    500000 element insert/retrieved in 143 ms.
    500000 element insert/retrieved in 134 ms.
    For the map [class java.util.concurrent.ConcurrentHashMap] the average time is 157 ms.
    Start pressure testing the map [class java.util.concurrent.ConcurrentSkipListMap] use the threshold [60]
    500000 element insert/retrieved in 514 ms.
    500000 element insert/retrieved in 516 ms.
    500000 element insert/retrieved in 502 ms.
    500000 element insert/retrieved in 493 ms.
    500000 element insert/retrieved in 587 ms.
    For the map [class java.util.concurrent.ConcurrentSkipListMap] the average time is 522 ms.
    Start pressure testing the map [class java.util.concurrent.ConcurrentHashMap] use the threshold [70]
    500000 element insert/retrieved in 190 ms.
    500000 element insert/retrieved in 136 ms.
    500000 element insert/retrieved in 142 ms.
    500000 element insert/retrieved in 137 ms.
    500000 element insert/retrieved in 132 ms.
    For the map [class java.util.concurrent.ConcurrentHashMap] the average time is 147 ms.
    Start pressure testing the map [class java.util.concurrent.ConcurrentSkipListMap] use the threshold [70]
    500000 element insert/retrieved in 506 ms.
    500000 element insert/retrieved in 498 ms.
    500000 element insert/retrieved in 515 ms.
    500000 element insert/retrieved in 532 ms.
    500000 element insert/retrieved in 510 ms.
    For the map [class java.util.concurrent.ConcurrentSkipListMap] the average time is 512 ms.
    Start pressure testing the map [class java.util.concurrent.ConcurrentHashMap] use the threshold [80]
    500000 element insert/retrieved in 258 ms.
    500000 element insert/retrieved in 146 ms.
    500000 element insert/retrieved in 133 ms.
    500000 element insert/retrieved in 150 ms.
    500000 element insert/retrieved in 149 ms.
    For the map [class java.util.concurrent.ConcurrentHashMap] the average time is 167 ms.
    Start pressure testing the map [class java.util.concurrent.ConcurrentSkipListMap] use the threshold [80]
    500000 element insert/retrieved in 593 ms.
    500000 element insert/retrieved in 529 ms.
    500000 element insert/retrieved in 548 ms.
    500000 element insert/retrieved in 546 ms.
    500000 element insert/retrieved in 543 ms.
    For the map [class java.util.concurrent.ConcurrentSkipListMap] the average time is 551 ms.
    Start pressure testing the map [class java.util.concurrent.ConcurrentHashMap] use the threshold [90]
    500000 element insert/retrieved in 221 ms.
    500000 element insert/retrieved in 124 ms.
    500000 element insert/retrieved in 136 ms.
    500000 element insert/retrieved in 132 ms.
    500000 element insert/retrieved in 136 ms.
    For the map [class java.util.concurrent.ConcurrentHashMap] the average time is 149 ms.
    Start pressure testing the map [class java.util.concurrent.ConcurrentSkipListMap] use the threshold [90]
    500000 element insert/retrieved in 589 ms.
    500000 element insert/retrieved in 514 ms.
    500000 element insert/retrieved in 562 ms.
    500000 element insert/retrieved in 515 ms.
    500000 element insert/retrieved in 559 ms.
    For the map [class java.util.concurrent.ConcurrentSkipListMap] the average time is 547 ms.
    ConcurrentHashMap
    Count:10,ms:239
    Count:20,ms:226
    Count:30,ms:156
    Count:40,ms:136
    Count:50,ms:137
    Count:60,ms:157
    Count:70,ms:147
    Count:80,ms:167
    Count:90,ms:149
    =============================
    ConcurrentSkipListMap
    Count:10,ms:667
    Count:20,ms:553
    Count:30,ms:523
    Count:40,ms:552
    Count:50,ms:532
    Count:60,ms:522
    Count:70,ms:512
    Count:80,ms:551
    Count:90,ms:547
    =============================
    

      结果表明:

    ConcurrentHashMap确实比ConcurrentSkipListMap性能优越
  • 相关阅读:
    关于如何使用Microsoft Word发博客
    TEST
    信息安全系统设计基础第三周学习总结
    信息安全系统设计基础第一周学习总结
    Java程序设计实验 实验五
    实验三 敏捷开发与XP实践 实验报告
    git 连接github的配置
    nginx是什么,如何使用
    spring-boot 全面认知
    删除指定目录文件夹下的文件
  • 原文地址:https://www.cnblogs.com/zheaven/p/13803560.html
Copyright © 2011-2022 走看看