前に同僚と話題になったので。最初HogeAで考えていて、同僚がHogeBがいいよといい。
実行コード
import java.util.HashMap; import java.util.Map; import java.util.stream.Collectors; import java.util.stream.Stream; import com.google.common.collect.Maps; public class EnumSample { public static void main(String[] args) { { long base = System.currentTimeMillis(); for (int i = 0; i < 1000000; i++) { HogeTypeA type = HogeTypeA.getEnum(1); } long diff = System.currentTimeMillis() - base; System.out.println("testA:" + String.valueOf(diff)); } { long base = System.currentTimeMillis(); for (int i = 0; i < 1000000; i++) { HogeTypeB type = HogeTypeB.getEnum(1); } long diff = System.currentTimeMillis() - base; System.out.println("testB:" + String.valueOf(diff)); } { long base = System.currentTimeMillis(); for (int i = 0; i < 1000000; i++) { HogeTypeC type = HogeTypeC.getEnum(1); } long diff = System.currentTimeMillis() - base; System.out.println("testC:" + String.valueOf(diff)); } } } enum HogeTypeA { ON(0), OFF(1); private int code; private HogeTypeA(int code) { this.code = code; } public int code() { return this.code; } public static HogeTypeA getEnum(int code) { return toEnum.get(code); } private static Map<Integer, HogeTypeA> toEnum = new HashMap<Integer, HogeTypeA>() { private static final long serialVersionUID = 1L; { Stream.of(HogeTypeA.values()) .forEach(type -> { put(type.code(), type); }); ; } }; } enum HogeTypeB { ON(0), OFF(1); private int code; private HogeTypeB(int code) { this.code = code; } public int code() { return this.code; } public static HogeTypeB getEnum(int code) { return toEnum.get(code); } private static final Map<Integer, HogeTypeB> toEnum = Maps.newHashMap(); static { for (HogeTypeB type : values()) toEnum.put(type.code(), type); } } enum HogeTypeC { ON(0), OFF(1); private int code; private HogeTypeC(int code) { this.code = code; } public int code() { return this.code; } public static HogeTypeC getEnum(int code) { return toEnum.get(code); } private static final Map<Integer, HogeTypeC> toEnum; static { toEnum = Stream.of(HogeTypeC.values()) .collect(Collectors.toMap(HogeTypeC::code, type -> type)); } }
実行結果
testA:89 testB:48 testC:53
単純な実行だとHogeBが早そう。
Cも悪くなさそうなんだけど、JVMの最適化のせいなのか、Aを抜いて、BとCだけ実行すると下記のようなスコアになるので、Streamは速度いまいちっぽいのよね。
実行結果2
testB:45 testC:118
Javaプログラマーなら習得しておきたい Java SE 8 実践プログラミング
- 作者: Cay S. Horstmann
- 出版社/メーカー: インプレス
- 発売日: 2015/04/03
- メディア: Kindle版
- この商品を含むブログ (3件) を見る