【问题标题】:How to measure time taken by Java code? [duplicate]如何测量 Java 代码所花费的时间? [复制]
【发布时间】:2013-12-11 06:36:53
【问题描述】:

我需要分析 Java 中某些算法的复杂性。为此,我计划提供大量输入并测量 Java 实现所花费的时间。检查某些代码行之间的时间的最精确和准确的方法是什么?我需要以毫秒为单位的精度...

【问题讨论】:

  • 不完全是!我一直在寻找类似 System.nanoTime() 的东西,但是上面提到的问题更多是关于一些正式的基准测试。它需要一些深度阅读,这可能对普通读者没有帮助。
  • @MangatRai:在这个领域做一个“随便的读者”是很危险的:几乎所有你真的需要“检查一些代码行之间的时间”的情况都是严重受到该问题中讨论的内容的影响。否则,您将获得毫无价值或误导性的数据并做出错误的决定。
  • 您的问题与时间复杂度有什么关系?您是否了解时间复杂度是一种静态分析,而您要求进行性能基准测试?
  • @Joachim Saucer 我明白这一点。对于普通读者,我的意思是运行一些快速测试以了解自己的理解。
  • @val 时间复杂度确实是一种静态分析,但我们可以通过性能基准测试来估计它。说在第一次运行时我给出 n 个元素,然后是 2n、3n ......等等。通过根据所用时间绘制图表,我可以得到一个想法,比如复杂性是线性的还是更高的多项式。当然,我们不会得到确切的时间复杂度,但我更多地询问了关于使用一些代码的问题。

标签: java time-complexity


【解决方案1】:
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】:

使用诸如Speed4j 之类的库。这不仅可以对调用进行基准测试,还可以在日志中提供统计信息,您还可以通过 JMX 远程查看它们。最好使用这样的库而不是在整个代码中放置 System.current.. 调用。

【讨论】:

  • +1 添加新内容 =)
  • 酷!真的很好的补充
【解决方案3】:
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 来了解执行时间
【解决方案4】:

使用System.nanoTime()System.currentTimeMillis() 获取代码的开始时间和结束时间。请注意,微基准仅测量 JVM 性能的基本方面。请注意 JVM 的预热阶段,之后会启动 JIT

【讨论】:

【解决方案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 指出的答案。里面有很多很棒的东西。

【讨论】:

    【解决方案6】:

    您甚至可以使用System.nanoTime() 获得纳秒级分辨率。

    但是,您可能需要考虑以下几点:

    How do I write a correct micro-benchmark in Java?

    【讨论】:

    • 你提到的问题很好。我会仔细阅读它...
    猜你喜欢
    • 2020-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-10
    • 2010-09-23
    • 1970-01-01
    相关资源
    最近更新 更多