How to measure time taken by Java code?
我需要分析Java中的一些算法的复杂性。为此,我计划提供大量的输入,并测量Java实现所花费的时间。检查某些代码行之间的时间最精确和准确的方法是什么?我需要精确到毫秒…
- 不完全是!我在寻找类似System.NanoTime()的东西,但是上面提到的问题更多的是关于一些正式的基准测试。它需要一些深度的阅读,这可能对一个随便的读者没有帮助。
- @Mangatrai:作为一个"临时读者"在这个领域是危险的:几乎所有你真正需要"检查代码行之间的时间"的情况都会受到这个问题中讨论的内容的严重影响。否则,你将得到毫无价值或误导性的数据,并做出错误的决定。
- 你的问题与时间复杂性有什么关系?您是否了解时间复杂性是静态分析,而您要求绩效基准?
- @乔阿希姆,我明白。对于不经意的读者,我的意思是为了自己的理解而运行一些快速测试。
- @VAL时间复杂性确实是一个静态分析,但是我们可以通过性能基准来评估它。说第一次跑步我给了N个元素,然后是2N,3N…等等。通过绘制一个图表,根据所花费的时间,我可以得到一个概念,比如复杂度是线性的还是更高的多项式。当然,我们不会得到确切的时间复杂性,但我问了更多关于玩一些代码的问题。
甚至可以使用System.nanoTime()获得纳秒分辨率。
但是,您可能需要考虑以下几点:
如何在Java中编写正确的微基准?
使用speed4j等库,不仅可以对调用进行基准测试,还可以在日志中提供统计信息,还可以通过jmx远程查看。最好使用这样的库,而不是放置System.Current。在整个代码中调用。
假设你有一个特别的方法,你想把它放在显微镜下。您可以这样做:
1 2 3 4 5
| long time1 = System. nanoTime();
thatMethod ();
long time2 = System. nanoTime();
long timeTaken = time2 - time1 ;
System. out. println("Time taken" + timeTaken +" ns"); |
计算机真的很快,所以在使用getTimeMillis()时可能会出现时差,可能为零。因此,使用nanoTime()
您也可以使用Caliper。他们有一段视频要开始。另外,仔细阅读creichen所指的答案。里面有很多很棒的东西。
使用System.nanoTime()或System.currentTimeMillis()来获取代码的开始和结束时间。请注意,微观基准只测量JVM性能的基本方面。注意JVM的预热阶段,在这之后JIT就开始了。
- 我建议使用system.nantime()stackoverflow.com/questions/11591000/…
1 2 3 4 5 6
| long startTime = System. currentTimeMillis();
//code lines whose time you want to calculate
long endTime = System. currentTimeMillis();
System. out. println("Took"+(endTime - startTime ) +" ms"); |
。
- 我很想这么做,但是……请格式化您的代码。避免陈述已经陈述的内容。
1 2 3 4
| long start = System. currentTimeMillis();
// your code
long end = System. currentTimeMillis();
long diff = end -start ; |
或
1 2 3 4 5
| long start = System. nanoTime();
// your code
long end = System. nanoTime();
long diff = end -start ;
long diffInMillis = diff /1000000; |
号
- 我建议不要使用currentTimeMillis来知道执行时间。