测量 时间 java_用Java测量时间

本文探讨了在Java中如何准确测量算法执行时间的问题。作者通过对比System.currentTimeMillis()和System.nanoTime(),指出System.nanoTime()更适合用于计算两个事件之间的时间差,以避免因时钟调整导致的不准确结果。建议使用Guava的Stopwatch类或Caliper进行更精确的基准测试。
摘要由CSDN通过智能技术生成

所以我试图测量两个不同的算法实现完成给定任务所花费的时间,结果如下:

i alg1 alg2

4 0.002 0.0

5 0.001 0.0

6 0.003 0.002

7 0.023 0.01

8 0.055 0.041

9 0.056 0.0

10 0.208 0.101

11 1.767 0.694

12 18.581 7.784

我只是一些输入参数.

我已经使用以下(天真)函数测量了算法的性能:

private double getDuration() {

return (double)(System.currentTimeMillis() - startTime) / (double)1000;

}

获得更多真实结果(除了0.0,显然不是真的!)比使用System.currentTimeMillis()更好的方法是什么?我知道我可以一遍又一遍地运行算法并总结他们的结果,但我有这种直觉,可能有一些更健壮的方法来测量Java中的传递时间(如果可能的话,真实的,用户和sys!).

谢谢

解决方法:

对于基本计时,您可以使用Guava的Stopwatch class(或者如果您不想使用整个Guava库,只需获取其源代码).有关更完整的基准测试解决方案,请查看同一团队的Caliper.

这两个都基于System.nanoTime(),您应该优先使用System.currentTimeMillis()来测量经过的时间.基本原因是System.currentTimeMillis()是一个“时钟”(试图返回挂起时间),而System.nanoTime()是一个“计时器”(它尝试从某个任意点返回时间).

当你想要弄清楚单个事件发生的时候,你想要一个时钟,所以你可以用你的手表或墙上的时钟(或其他计算机的时钟)排队.但它不适合测量同一系统上两个事件之间的经过时间,因为计算机偶尔会调整其内部时钟对应于挂壁时间的概念.例如,如果你这样做

long timeA = System.currentTimeMillis();

doStuff();

long timeB = System.currentTimeMillis();

System.out.println("Elapsed time: " + (timeB - timeA));

如果在执行doStuff()时NTP向后调整,则可能会得到否定结果. System.nanoTime(),作为计时器而不是时钟,应该忽略该调整,从而避免这个问题.

(请注意,以上所有内容都是概念性的;不幸的是,在实现级别上事情可能会变得混乱.但这并不会改变建议:System.nanoTime()应该是您可以在平台上获得的最佳计时器,而System .currentMilliseconds()应该是你能得到的最佳时钟.)

标签:java,time,profiling,performance

来源: https://codeday.me/bug/20190716/1481350.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值