package org.springside.jmh;
import java.util.EnumMap;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.BenchmarkMode;
import org.openjdk.jmh.annotations.Fork;
import org.openjdk.jmh.annotations.Level;
import org.openjdk.jmh.annotations.Measurement;
import org.openjdk.jmh.annotations.Mode;
import org.openjdk.jmh.annotations.OutputTimeUnit;
import org.openjdk.jmh.annotations.Scope;
import org.openjdk.jmh.annotations.Setup;
import org.openjdk.jmh.annotations.State;
import org.openjdk.jmh.annotations.Threads;
import org.openjdk.jmh.annotations.Warmup;
/**
* 对比测试两种HashMap与EnumMap法的性能
*
* 结果相差一倍
*/
@BenchmarkMode(Mode.Throughput)
@OutputTimeUnit(TimeUnit.MILLISECONDS)
@Warmup(iterations = 5)
@Measurement(iterations = 5, time = 5, timeUnit = TimeUnit.SECONDS)
@Threads(1)
@State(Scope.Benchmark)
public class EnumMapTest {
public enum TestEnum {
ONE, TWO, THREE, FOUR, FIVE, SIX, SEVEN;
}
private EnumMap<TestEnum, Integer> enumMap;
private HashMap<TestEnum, Integer> hashEnumKeyMap;
private HashMap<String, Integer> hashStringKeyMap;
@Setup(Level.Trial)
public void setup() {
hashStringKeyMap = new HashMap<String, Integer>();
initStringKeyMap(hashStringKeyMap);
hashEnumKeyMap = new HashMap<TestEnum, Integer>();
initEnumKeyMap(hashEnumKeyMap);
enumMap = new EnumMap<TestEnum, Integer>(TestEnum.class);
initEnumKeyMap(enumMap);
}
private void initEnumKeyMap(Map<TestEnum, Integer> map) {
map.put(TestEnum.ONE, new Integer(1));
map.put(TestEnum.TWO, new Integer(2));
map.put(TestEnum.FOUR, new Integer(4));
map.put(TestEnum.SIX, new Integer(6));
map.put(TestEnum.SEVEN, new Integer(7));
}
private void initStringKeyMap(Map<String, Integer> map) {
map.put("ONE", new Integer(1));
map.put("TWO", new Integer(2));
map.put("FOUR", new Integer(4));
map.put("SIX", new Integer(6));
map.put("SEVEN", new Integer(7));
}
private int caculateEnumKeyMap(Map<TestEnum, Integer> map) {
int result = 0;
result += map.get(TestEnum.ONE);
result += map.get(TestEnum.TWO);
result += map.get(TestEnum.FOUR);
result += map.get(TestEnum.SIX);
return result;
}
private Integer caculateStringKeyMap(HashMap<String, Integer> map) {
int result = 0;
result += map.get("ONE");
result += map.get("TWO");
result += map.get("FOUR");
result += map.get("SIX");
return result;
}
@Benchmark
@Fork(value = 1)
public Integer hashMapWithStringKey() {
return caculateStringKeyMap(hashStringKeyMap);
}
@Benchmark
@Fork(value = 1)
public Integer hashMapWithEnumKey() {
return caculateEnumKeyMap(hashEnumKeyMap);
}
@Benchmark
@Fork(value = 1)
public Integer enumMap() {
return caculateEnumKeyMap(enumMap);
}
}