【问题标题】:How to calculate the running time of my program? [duplicate]如何计算我的程序的运行时间? [复制]
【发布时间】:2021-11-08 14:05:01
【问题描述】:

我写了一个程序,现在我想计算我的程序从开始到结束的总运行时间。

我该怎么做?

【问题讨论】:

    标签: java performance


    【解决方案1】:

    使用System.nanoTime 获取当前时间。

    long startTime = System.nanoTime();
    .....your program....
    long endTime   = System.nanoTime();
    long totalTime = endTime - startTime;
    System.out.println(totalTime);
    

    以上代码以纳秒为单位打印程序的运行时间。

    【讨论】:

    • long totalTime = (endTime - startTime)/1000; System.out.println(总时间);如果使用 segs
    • 感谢@snakile。如果该方法涉及大量数据库事务,是否准确?
    • System.nanoTime() 更准确。请参阅 krtek 的帖子。 @feelgoodandprogramming
    • 这已经过时了。整个 SO 都有更好的答案 - 这应该被删除。特别是因为它不会阻止手动计算单位转换。
    • @anon58192932,谢谢。我已经更新了答案以避免误导人们到达它。
    【解决方案2】:

    在你的 main 方法的开头,添加这行代码:

    final long startTime = System.nanoTime();
    

    然后,在你的 main 方法的最后一行,你可以添加:

    final long duration = System.nanoTime() - startTime;
    

    duration 现在包含程序运行的时间(以纳秒为单位)。例如,您可以像这样打印此值:

    System.out.println(duration);
    

    如果要以秒为单位显示持续时间,则必须将该值除以 1'000'000'000。或者如果你想要一个Date 对象:Date myTime = new Date(duration / 1000); 然后你可以访问Date 的各种方法来打印分钟数、小时数等。

    【讨论】:

    • 感谢@krtek。如果该方法涉及大量数据库事务,是否准确?
    • 两次调用nanoTime 之间发生的事情完全没有影响。
    • long seconds = TimeUnit.NANOSECONDS.toSeconds(after - before);
    【解决方案3】:

    如果您想要更精确的读数,请使用 System.currentTimeMillis() 或 System.nanoTime()。通常,如果您需要将值输出给用户,毫秒就足够精确了。此外,System.nanoTime()可能返回负值,因此,如果您使用该方法,返回值可能不正确。

    一般和广泛的用途是使用毫秒:

    long start = System.currentTimeMillis();
    
    ... 
    
    
    long end = System.currentTimeMillis();
    
    NumberFormat formatter = new DecimalFormat("#0.00000");
    System.out.print("Execution time is " + formatter.format((end - start) / 1000d) + " seconds");
    

    请注意,纳秒通常用于计算非常短且精确的程序执行,例如单元测试和基准测试。因此,对于整个程序执行,毫秒是更可取的。

    【讨论】:

    • 请注意 System.currentTimeMillis() 会受到系统时钟变化的影响,而 System.nanoTime() 则不会。因此,如果 NTP 将系统时钟调回 5 分钟,则 System.currentTimeMills() 的结果可能是 55 分钟,而 System.nanoTime() 的结果可能是 60 分钟。
    【解决方案4】:

    对此的一般方法是:

    1. 获取基准测试开始时的时间,例如main() 的开始时间。
    2. 运行您的代码。
    3. 获取基准测试结束时的时间,例如main() 的末尾。
    4. 从结束时间中减去开始时间并转换为适当的单位。

    提示:查看System.nanoTime()System.currentTimeMillis()

    【讨论】:

    • 附加说明:从 1.5 开始,您可以使用 java.util.concurrent.TimeUnit 轻松地将毫秒,尤其是纳秒转换为其他单位。
    【解决方案5】:

    您需要获取应用程序启动的时间,并将其与应用程序结束的时间进行比较。

    应用启动时:

    Calendar calendar = Calendar.getInstance();
    
    // Get start time (this needs to be a global variable).
    Date startDate = calendar.getTime();
    

    申请结束时

    Calendar calendar = Calendar.getInstance();
    
    // Get start time (this needs to be a global variable).
    Date endDate = calendar.getTime();
    

    要获得差异(以毫秒为单位),请执行以下操作:

    long sumDate = endDate.getTime() - startDate.getTime();
    

    【讨论】:

    • 使用日期和日历来获得以毫秒为单位的持续时间对我来说似乎有点“矫枉过正”,System.currentTimeMillis() 会是一个更好的选择。如果您在 main 方法中复制所有行,日历将被定义两次 -> 编译错误
    【解决方案6】:

    除了众所周知的(并且已经提到过)System.currentTimeMillis()System.nanoTime() 之外,还有一个名为 perf4j 的简洁库,它可能也很有用,当然这取决于您的目的。

    【讨论】:

    • 不错的库,但大约 8 年没有更新了。
    猜你喜欢
    • 2011-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-05
    • 2019-10-11
    相关资源
    最近更新 更多