本文共 1709 字,大约阅读时间需要 5 分钟。
本问题已经有最佳答案,请猛点这里访问。
我需要分析Java中的一些算法的复杂性。为此,我计划提供大量的输入,并测量Java实现所花费的时间。检查某些代码行之间的时间最精确和准确的方法是什么?我需要精确到毫秒…
不完全是!我在寻找类似System.NanoTime()的东西,但是上面提到的问题更多的是关于一些正式的基准测试。它需要一些深度的阅读,这可能对一个随便的读者没有帮助。
@Mangatrai:作为一个"临时读者"在这个领域是危险的:几乎所有你真正需要"检查代码行之间的时间"的情况都会受到这个问题中讨论的内容的严重影响。否则,你将得到毫无价值或误导性的数据,并做出错误的决定。
你的问题与时间复杂性有什么关系?您是否了解时间复杂性是静态分析,而您要求绩效基准?
@乔阿希姆,我明白。对于不经意的读者,我的意思是为了自己的理解而运行一些快速测试。
@VAL时间复杂性确实是一个静态分析,但是我们可以通过性能基准来评估它。说第一次跑步我给了N个元素,然后是2N,3N…等等。通过绘制一个图表,根据所花费的时间,我可以得到一个概念,比如复杂度是线性的还是更高的多项式。当然,我们不会得到确切的时间复杂性,但我问了更多关于玩一些代码的问题。
甚至可以使用System.nanoTime()获得纳秒分辨率。
但是,您可能需要考虑以下几点:
如何在Java中编写正确的微基准?
你提到的问题很好。我会通读的…
使用speed4j等库,不仅可以对调用进行基准测试,还可以在日志中提供统计信息,还可以通过jmx远程查看。最好使用这样的库,而不是放置System.Current。在整个代码中调用。
+1用于添加新内容=)
酷!很好的补充
假设你有一个特别的方法,你想把它放在显微镜下。您可以这样做:
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/…
long startTime = System.currentTimeMillis();
//code lines whose time you want to calculate
long endTime = System.currentTimeMillis();
System.out.println("Took"+(endTime - startTime) +" ms");
。
我很想这么做,但是……请格式化您的代码。避免陈述已经陈述的内容。
long start = System.currentTimeMillis();
// your code
long end = System.currentTimeMillis();
long diff = end-start;
或
long start = System.nanoTime();
// your code
long end = System.nanoTime();
long diff = end-start;
long diffInMillis = diff/1000000;
号
我建议不要使用currentTimeMillis来知道执行时间。
转载地址:https://blog.csdn.net/weixin_39987847/article/details/114567814 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!