您的位置:首页 > 其它

比较SynchronizedMap、Hashtable和ConcurrentHashMap的效率

2016-11-10 00:00 330 查看
分别通过三种方式创建Map对象,使用
ExecutorService
来并发运行5个线程,每个线程添加/获取500K个元素。

package cglib;

import java.util.Collections;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class StringNumber {

public final static int THREAD_POOL_SIZE = 5;

public static Map<String, Integer> crunchifyHashTableObject = null;
public static Map<String, Integer> crunchifySynchronizedMapObject = null;
public static Map<String, Integer> crunchifyConcurrentHashMapObject = null;

public static void main(String[] args) throws InterruptedException {

// Test with Hashtable Object
crunchifyHashTableObject = new Hashtable<>();
crunchifyPerformTest(crunchifyHashTableObject);

// Test with synchronizedMap Object
crunchifySynchronizedMapObject = Collections.synchronizedMap(new HashMap<String, Integer>());
crunchifyPerformTest(crunchifySynchronizedMapObject);

// Test with ConcurrentHashMap Object
crunchifyConcurrentHashMapObject = new ConcurrentHashMap<>();
crunchifyPerformTest(crunchifyConcurrentHashMapObject);

}

public static void crunchifyPerformTest(final Map<String, Integer> crunchifyThreads) throws InterruptedException {

System.out.println("Test started for: " + crunchifyThreads.getClass());
long averageTime = 0;
for (int i = 0; i < 5; i++) {

long startTime = System.nanoTime();
ExecutorService crunchifyExServer = Executors.newFixedThreadPool(THREAD_POOL_SIZE);

for (int j = 0; j < THREAD_POOL_SIZE; j++) {
crunchifyExServer.execute(new Runnable() {
@SuppressWarnings("unused")
@Override
public void run() {

for (int i = 0; i < 500000; i++) {
Integer crunchifyRandomNumber = (int) Math.ceil(Math.random() * 550000);

// Retrieve value. We are not using it anywhere
Integer crunchifyValue = crunchifyThreads.get(String.valueOf(crunchifyRandomNumber));

// Put value
crunchifyThreads.put(String.valueOf(crunchifyRandomNumber), crunchifyRandomNumber);
}
}
});
}

// Make sure executor stops
crunchifyExServer.shutdown();

// Blocks until all tasks have completed execution after a shutdown request
crunchifyExServer.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS);

long entTime = System.nanoTime();
long totalTime = (entTime - startTime) / 1000000L;
averageTime += totalTime;
System.out.println("2500K entried added/retrieved in " + totalTime + " ms");
}
System.out.println("For " + crunchifyThreads.getClass() + " the average time is " + averageTime / 5 + " ms\n");
}

}

输出:

Test started for: class java.util.Hashtable
2500K entried added/retrieved in 3816 ms
2500K entried added/retrieved in 2916 ms
2500K entried added/retrieved in 3040 ms
2500K entried added/retrieved in 2819 ms
2500K entried added/retrieved in 2855 ms
For class java.util.Hashtable the average time is 3089 ms

Test started for: class java.util.Collections$SynchronizedMap
2500K entried added/retrieved in 3430 ms
2500K entried added/retrieved in 2775 ms
2500K entried added/retrieved in 2891 ms
2500K entried added/retrieved in 2710 ms
2500K entried added/retrieved in 2811 ms
For class java.util.Collections$SynchronizedMap the average time is 2923 ms

Test started for: class java.util.concurrent.ConcurrentHashMap
2500K entried added/retrieved in 1814 ms
2500K entried added/retrieved in 1135 ms
2500K entried added/retrieved in 1051 ms
2500K entried added/retrieved in 1008 ms
2500K entried added/retrieved in 1560 ms
For class java.util.concurrent.ConcurrentHashMap the average time is 1313 ms
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: