首先,我必须承认这些都是非常基本和原始的问题......我想演示 Java 中用于排序和搜索的不同算法,并为运行时获取一个值。有我无法解决的问题:
有热点编译 - 这是我需要停用的运行时优化(我猜)。
如何获取运行时的时间值(秒)?在执行之前启动计时器并在之后停止它......似乎有点原始。并且计时器对象本身会消耗运行时......我需要避免这种情况。
Java API 中有什么东西可以用来解决这些问题吗?
谢谢,克劳斯
首先,我必须承认这些都是非常基本和原始的问题......我想演示 Java 中用于排序和搜索的不同算法,并为运行时获取一个值。有我无法解决的问题:
有热点编译 - 这是我需要停用的运行时优化(我猜)。
如何获取运行时的时间值(秒)?在执行之前启动计时器并在之后停止它......似乎有点原始。并且计时器对象本身会消耗运行时......我需要避免这种情况。
Java API 中有什么东西可以用来解决这些问题吗?
谢谢,克劳斯
您可以在命令行上禁用 HotSpot -Xint
,以使性能下降一个数量级。但是,您为什么不想衡量现实世界的表现呢?编译时,不同的东西可能会成为瓶颈。
通常用于微基准测试:
System.nanoTime
在开始和结束时获得时间测量使用-Xint
JVM 标志。其他选项可以在这里看到。
使用ThreadMXBean
API 获取线程的 CPU/用户时间。可以在这里看到一个例子。
使用 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);