首先我必须承认这些都是非常基本和原始的问题......我想演示 Java 中用于排序和搜索的不同算法,并获取运行时的值。有一些问题我无法解决:

  1. 有热点编译 - 这是我需要停用的运行时优化(我猜)。

  2. 如何获取运行时的时间值(秒)?在执行之前启动计时器并在执行之后停止......似乎有点原始。并且计时器对象本身会消耗运行时间......我需要避免这种情况。

Java API 中有什么可以用来解决这些问题吗?

谢谢,克劳斯

有帮助吗?

解决方案

  1. 使用 -Xint JVM标志。其他选项可以在这里看到。

  2. 使用 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);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top