【发布时间】:2023-04-05 17:55:01
【问题描述】:
我有一个数独求解算法,我的目标是尽可能快地完成它。为了测试这个算法,我多次运行它并计算平均值。在注意到一些奇怪的数字后,我决定一直打印并得到以下结果:
Execution Time : 4.257746 ms (#1)
Execution Time : 7.610686 ms (#2)
Execution Time : 6.277609 ms (#3)
Execution Time : 7.595707 ms (#4)
Execution Time : 7.610131 ms (#5)
Execution Time : 5.011104 ms (#6)
Execution Time : 3.970937 ms (#7)
Execution Time : 3.923783 ms (#8)
Execution Time : 4.070238 ms (#9)
Execution Time : 4.765347 ms (#10)
Execution Time : 0.818264 ms (#11)
Execution Time : 0.620216 ms (#12)
Execution Time : 0.679021 ms (#13)
Execution Time : 0.643516 ms (#14)
Execution Time : 0.718408 ms (#15)
Execution Time : 0.744481 ms (#16)
Execution Time : 0.760569 ms (#17)
Execution Time : 0.80384 ms (#18)
Execution Time : 0.75946 ms (#19)
Execution Time : 0.802176 ms (#20)
Execution Time : 66.032508 ms : average = 3.3016254000000003
在 10 到 15 次执行后(随机变化),算法的性能显着提高。如果我运行它几百次,它最终会稳定在 0.3ms 左右。请注意,我在此循环之前运行了一次算法,以便 JIT 执行此操作。
此外,如果我在运行循环之前让线程休眠 2 秒,我的所有时间都是 1 毫秒 (+/- 0.2)。
此外,如果我在循环之前解决了大约 500 次通用数独(对角线为 1-9 的网格),我的所有时间都在 0.3 毫秒左右(+/- 0.02)。
每个解决方案都是相同的。所有值都被重置。
所以我的问题是多方面的:
-为什么在连续求解后每次求解时间都会缩短?
-为什么在 10-15 次解决后我的解决时间突然下降?
【问题讨论】:
-
JIT 不必在第一次运行时进行优化。事实上,它很可能不会,因为优化代码的成本是不合理的,除非它被证明是一段重要的代码(运行足够频繁)。
-
你无意中创造了一个可以解决数独的人工生命体,它可能会进化成天网。立即退出并开始销售椰子。
-
使用
-XX:+PrintCompilationjava 选项检查 JIT 编译。 -
有 JVM 启动选项可以实时显示关于(去)优化的 JIT 决策:blog.headius.com/2009/01/my-favorite-hotspot-jvm-flags.html
-
在这个范围内,可能是因为其他程序使用了多少
cpu。
标签: java performance algorithm jvm jit