-
03-07-2019 - |
题
首先我必须承认这些都是非常基本和原始的问题......我想演示 Java 中用于排序和搜索的不同算法,并获取运行时的值。有一些问题我无法解决:
有热点编译 - 这是我需要停用的运行时优化(我猜)。
如何获取运行时的时间值(秒)?在执行之前启动计时器并在执行之后停止......似乎有点原始。并且计时器对象本身会消耗运行时间......我需要避免这种情况。
Java API 中有什么可以用来解决这些问题吗?
谢谢,克劳斯
解决方案
-
使用
-Xint
JVM标志。其他选项可以在这里看到。 -
使用
ThreadMXBean
用于获取线程的CPU /用户时间的API。 此处可以看到一个例子。
醇>
其他提示
您可以禁用 HotSpot -Xint
在命令行上,性能会降低一个数量级。但是,您为什么不想衡量现实世界的性能呢?编译时,不同的东西可能会成为瓶颈。
通常对于微基准:
- 使用
System.nanoTime
获取开始和结束的时间测量 - 运行合理的时间长度
- 多次进行测量(有一些“热身”)
- 不要交错不同算法的测量
- 不要在测量段中执行任何 I/O
- 使用结果(HotSpot可以完全优化掉琐碎的操作)
- 在现实世界中进行(或尽可能在 cloae 中进行)
- 请记住双核是常态,更多核心将成为常态
使用System.nanoTime()两次消耗不到1微秒。我建议你运行任何基准测试并取平均值,这样微秒误差就不会很大。
总的来说,我建议不要让事情变得比你需要的更复杂。
要进行内置预热,我经常会忽略前10%-20%的迭代次数。像
这样的东西long start;
int count;
for(int i = -count / 5; i < count; i++) {
if (count == 0) start = System.nanoTime();
// do tested code
}
long time = System.nanoTime() - start;
long average = time / count;
System.out.printf("Average time was %,d micro-seconds%n", average / 1000);
不隶属于 StackOverflow