今天和大家一起测试下各种常见 Map 类型在不同操作场景下的性能。
0. 准备工作
制定一个测试模板类,通过泛型兼容各种 Map 类型;定义抽象方法 test() ,用于执行各项测试操作,返回值为测试所花费的时间。
public abstract class MapTest<T extends Map> {
private T map;
public abstract long test();
public MapTest(T map) {
this.map = map;
}
public T getMap() {
return map;
}
public void setMap(T map) {
this.map = map;
}
}
再准备一个用于执行测试方法的工具类 MapPerformanceTest ,将后续待各项测试方法编写在其中,工具类提供构造测试数据的 getMap() 方法和打印测试信息的 displayHead() 方法。
public class MapPerformanceTest {
/**
* 获取指定长度的map
*
* @param map 容器
* @param size 容器长度
* @param <T>
* @return
*/
public static <T extends Map> T getMap(T map, int size) {
//清空遗留数据
map.clear();
for (int i = 0; i < size; i++) {
map.put(i, i);
}
return map;
}
/**
* 打印测试测试
*
* @param t 容器
* @param methodName 测试项目
* @param <T>
*/
public static <T> void displayHead(T t, String methodName) {
System.out.println();
System.out.println(t.getClass().getSimpleName() + "\t" + methodName);
System.out.println("容器长度\t操作次数\t平均时间");
}
}
1.添加
/**
* 添加测试
*
* @param map 容器
* @param size 容器长度
* @param <T>
*/
public static <T extends Map> void put(T map, int size) {
MapTest<T> mapTest = new MapTest<T>(map) {
@Override
public long test() {
long startTime = System.nanoTime();
//复用公共方法
MapPerformanceTest.getMap(getMap(), size);
long endTime = System.nanoTime();
return endTime - startTime;
}
};
//操作时间
long operateTime = mapTest.test();
//操作次数
int count = size;
//平均操作时间
long avg = operateTime / count;
System.out.println(size + "\t" + count + "\t" + avg);
}
public static void main(String[] args) {