2

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

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

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

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

谢谢,克劳斯

4

3 回答 3

5

您可以在命令行上禁用 HotSpot -Xint,以使性能下降一个数量级。但是,您为什么不想衡量现实世界的表现呢?编译时,不同的东西可能会成为瓶颈。

通常用于微基准测试:

  • 用于System.nanoTime在开始和结束时获得时间测量
  • 运行一段合理的时间
  • 多次测量(有一些“热身”)
  • 不要交错不同算法的测量
  • 不要在测量段中执行任何 I/O
  • 使用结果(HotSpot 可以完全优化掉琐碎的操作)
  • 在现实世界的情况下做(或尽可能的 cloae)
  • 记住双核是常态,更多的核心将成为常态
于 2009-05-04T12:53:55.860 回答
1
  1. 使用-XintJVM 标志。其他选项可以在这里看到。

  2. 使用ThreadMXBeanAPI 获取线程的 CPU/用户时间。可以在这里看到一个例子。

于 2009-05-04T12:54:13.860 回答
1

使用 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);
于 2009-05-04T19:00:36.490 回答