问题描述
我试图处理一些近似模拟确定性有限状态自动机的文本文件。这很有效,但性能绝对糟糕。
我开始调查并发现“代码大小”对性能有一个奇怪且非常大的影响。我创建了一个虚拟程序来说明效果。以下在我的电脑上速度可以接受(~0.250 秒):
package com.foo.bar;
import java.io.IOException;
import java.io.Reader;
import java.nio.file.Files;
import java.nio.file.Paths;
public class DummyFileProcessor {
public static void main(String[] args) throws IOException {
// `args[0]` is the path to the "citylots.json" file from here:
// https://github.com/zemirco/sf-city-lots-json (181 MB).
final long startTime = System.currentTimeMillis();
final short statealwaysZero = 0; // always 0 in this demo
try (Reader reader = Files.newBufferedReader(Paths.get(args[0]))) {
final char[] chunk = new char[4096];
for (int chunkLength = reader.read(chunk); chunkLength != -1; chunkLength = reader.read(chunk)) {
for (int i = 0; i < chunkLength; ++i) {
final short triggerAlwaysZero = 0; // always 0 in this demo
switch (statealwaysZero) {
case 0: {
switch (triggerAlwaysZero) {
case 0: { break; }
case 1: { break; }
case 2: { break; }
case 3: { break; }
case 4: { break; }
case 5: { break; }
case 6: { break; }
case 7: { break; }
case 8: { break; }
case 9: { break; }
case 10: { break; }
case 11: { break; }
case 12: { break; }
case 13: { break; }
case 14: { break; }
case 15: { break; }
case 16: { break; }
case 17: { break; }
case 18: { break; }
case 19: { break; }
case 20: { break; }
case 21: { break; }
case 22: { break; }
case 23: { break; }
case 24: { break; }
case 25: { break; }
case 26: { break; }
case 27: { break; }
case 28: { break; }
case 29: { break; }
}
break;
}
case 1: { break; }
case 2: { break; }
case 3: { break; }
case 4: { break; }
case 5: { break; }
case 6: { break; }
case 7: { break; }
case 8: { break; }
case 9: { break; }
case 10: { break; }
case 11: { break; }
case 12: { break; }
case 13: { break; }
case 14: { break; }
case 15: { break; }
case 16: { break; }
case 17: { break; }
case 18: { break; }
case 19: { break; }
case 20: { break; }
case 21: { break; }
case 22: { break; }
case 23: { break; }
case 24: { break; }
case 25: { break; }
case 26: { break; }
case 27: { break; }
case 28: { break; }
case 29: { break; }
case 30: { break; }
case 31: { break; }
case 32: { break; }
case 33: { break; }
case 34: { break; }
case 35: { break; }
case 36: { break; }
case 37: { break; }
case 38: { break; }
case 39: { break; }
}
}
}
}
final long endTime = System.currentTimeMillis();
System.out.println("done after " + (((double) (endTime - startTime)) / 1000) + "s");
}
}
现在我只是将 switch (triggerAlwaysZero) { ... }
部分复制到 1
的其他案例 (2
,switch (statealwaysZero)
,...) 中(这些案例从未被选中)。这会使代码变大,但仅对 0
到 33
的情况进行处理时不会产生太大影响。但是,当我将此 switch (triggerAlwaysZero) { ... }
部分也粘贴到案例 34
时,处理时间突然从大约 0.250 秒跳到大约 3.7 秒。
有人知道这里发生了什么吗?
$ java -version
openjdk version "11.0.9.1" 2020-11-04
OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.9.1+1)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 11.0.9.1+1,mixed mode)
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)