我目前正在尝试提高 Java 代码的性能。在深入了解需要优化的地方后,我最终得到了以下设置(为清楚起见进行了简化)。
被大量调用的 Board 构造函数(~200k 到 2M):
public Board(Board board) {
long now = System.currentTimeMillis();
this.macroBoard = new int[9];
int [] boardToCopy = board.getMacroBoard();
for (int i = 0; i < 9; i++){
this.macroBoard[i] = boardToCopy[i];
}
long duration = System.currentTimeMillis() - now;
if (duration > THRESHOLD){
System.err.println(duration);
}
}
在另一个班级:
long end = System.currentTimeMillis() + SIMULATION_DURATION;
while (System.currentTimeMillis() < end) {
...
...
Board board = new Board(otherBoard);
...
...
}
结果让我很困惑。事实上,我观察到两件事:
- SIMULATION_DURATION 越大,max(duration)越大;
- 当 SIMULATION_DURATION = 10s 时, max(duration)的值可以达到 2s(是秒,没有错字)。如果 SIMULATION_DURATION = 100 毫秒,我观察到最大(持续时间)约为 30 毫秒。
我的问题如下:
- 9 个整数数组的副本怎么会花这么长时间?
- 为什么持续时间在 99% 的情况下小于 0.1 毫秒,而剩下的 1% 则非常高?
- 为什么它取决于 SIMULATION_DURATION 的值?
- 我是否在使用 System.currentTimeMillis() 进行这种基准测试时犯了错误,因此结果完全不准确?
- 当我创建大量 Board 对象时,GC 是否参与了这种奇怪的行为?