【发布时间】:2018-04-09 20:41:37
【问题描述】:
注意:这不是关于性能问题。我只观察到我无法解释/理解的性能差异。
在对一些针对 Java 9 的新开发代码进行基准测试时,我发现了一些奇怪的东西。一个(非常)简单的HashMap 基准测试(带有 5 个键)显示 Java 9 比 Java 8 慢得多。这可以解释还是我的(基准)代码完全错误?
代码:
@Fork(
jvmArgsAppend = {"-Xmx512M", "-disablesystemassertions"}
)
public class JsonBenchmark {
@State(Scope.Thread)
public static class Data {
final static Locale RUSSIAN = new Locale("ru");
final static Locale DUTCH = new Locale("nl");
final Map<Locale, String> hashmap = new HashMap<>();
public Data() {
hashmap.put(Locale.ENGLISH, "Flat flashing adjustable for flat angled roof with swivel");
hashmap.put(Locale.FRENCH, "Solin pour toit plat inclinée");
hashmap.put(Locale.GERMAN, "Flachdachkragen Flach Schrägdach");
hashmap.put(DUTCH, "Plakplaat vlak/hellend dak inclusief glijschaal");
hashmap.put(RUSSIAN, "Проход через плоскую кровлю регулир. для накл. кровли");
}
}
@Benchmark
public int bmHashMap(JsonBenchmark.Data data) {
final Map<Locale, String> m = data.hashmap;
int sum = 0;
sum += m.get(Data.RUSSIAN).length();
sum += m.get(Locale.FRENCH).length();
sum += m.get(Data.DUTCH).length();
sum += m.get(Locale.ENGLISH).length();
sum += m.get(Locale.GERMAN).length();
return sum;
}
}
结果:
- Java 8_151:JsonBenchmark.bmHashMap thrpt 40 47948546.439 ± 560763.711 ops/s
- Java 9_181:JsonBenchmark.bmHashMap thrpt 40 34962904.479 ± 276045.691 操作/秒(-/- 27%!)
更新
感谢您的回答和伟大的 cmets。
@Holger 的建议。我的第一反应是:这一定是解释。但是,如果我只对
String#length()函数进行基准测试,性能上并没有显着差异。而且,当我只对HashMap#get()方法进行基准测试时(如 @Eugene 建议的那样),仍然存在大约 10 - 12 % 的差异。@Eugene 的建议。我更改了参数(更多的热身迭代,更多的内存),但我无法重现您的结果。但是,我将堆增加到 4G。但这并不能解释差异,不是吗?
@Alan Bateman 的建议。是的,这提高了性能!不过还是相差20%左右。
【问题讨论】:
标签: performance-testing java-9 jmh