用java计算方法的时间开销_Java中的时间测量开销

在这个页面上标记正确的答案其实是不正确的。这不是写一个基准的有效方法,因为JVM死代码消除(DCE),堆栈替换(OSR),循环展开等。只有像Oracle的JMH微基准框架这样的框架可以正确地测量这样的东西。如果您对这些微基准测试的有效性有任何疑问,请阅读

this post。

这里是一个JMH基准为System.currentTimeMillis()vs System.nanoTime():

@BenchmarkMode(Mode.AverageTime)

@OutputTimeUnit(TimeUnit.NANOSECONDS)

@State(Scope.Benchmark)

public class NanoBench {

@GenerateMicroBenchmark

public long currentTimeMillis() {

return System.currentTimeMillis();

}

@GenerateMicroBenchmark

public long nanoTime() {

return System.nanoTime();

}

}

这里的结果(在I​​ntel 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。然而,也清楚的是,一旦考虑到平均误差,两者之间存在非常小的差异。结果也可能因操作系统而异。但是总的来说应该是它们在开销方面基本上是等价的。

UPDATE 2015/08/25:虽然这个答案更接近正确,最多,使用JMH来衡量,它仍然不正确。测量类似System.nanoTime()本身是一种特殊的扭曲基准。答案和最后文章是here。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值