gpt4 book ai didi

java - Java中的时间测量开销

转载 作者:IT老高 更新时间:2023-10-28 20:37:20 26 4
gpt4 key购买 nike

在低级别测量耗时时,我可以选择使用以下任何一种:

System.currentTimeMillis();
System.nanoTime();

这两种方法都是 native 实现的。在深入研究任何 C 代码之前,是否有人知道调用其中一个或另一个是否有任何实质性开销?我的意思是,如果我真的不关心额外的精度,哪一个会占用更少的 CPU 时间?

注意:我使用的是标准 Java 1.6 JDK,但这个问题可能对任何 JRE 都有效...

最佳答案

此页面上标记为正确的答案实际上是不正确的。由于 JVM 死代码消除 (DCE)、堆栈上替换 (OSR)、循环展开等原因,这不是编写基准测试的有效方法。只有像 Oracle 的 JMH 微基准测试框架这样的框架才能正确测量类似的东西。阅读 this post如果您对此类微基准的有效性有任何疑问。

这是 System.currentTimeMillis()System.nanoTime() 的 JMH 基准测试:

@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@State(Scope.Benchmark)
public class NanoBench {
@Benchmark
public long currentTimeMillis() {
return System.currentTimeMillis();
}

@Benchmark
public long nanoTime() {
return System.nanoTime();
}
}

以下是结果(在 Intel Core i5 上):

Benchmark                            Mode  Samples      Mean   Mean err    Units
c.z.h.b.NanoBench.currentTimeMillis avgt 16 122.976 1.748 ns/op
c.z.h.b.NanoBench.nanoTime avgt 16 117.948 3.075 ns/op

这表明 System.nanoTime() 在每次调用 ~118ns 时比 ~123ns 稍快。然而,同样清楚的是,一旦将平均误差考虑在内,两者之间的差异非常小。结果也可能因操作系统而异。但总体来说应该是它们在开销方面基本上是相等的。

更新 2015/08/25:虽然这个答案更接近于纠正大多数,但使用 JMH 来衡量,它仍然不正确。测量像 System.nanoTime() 这样的东西本身就是一种特殊的扭曲基准测试。答案和权威文章是 here .

关于java - Java中的时间测量开销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5640409/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com