【问题标题】:How much time does it take to execute a loop?执行一个循环需要多少时间?
【发布时间】:2022-02-10 14:14:16
【问题描述】:

有没有办法知道在java中执行一个循环需要多少秒?

例如:

for(int i=0; i < 1000000; i++) {

//Do some difficult task goes in here

}

它不一定要 100% 准确,但它只是想知道它可能需要多长时间。里面的算法是某种写入 .txt 文件的密钥生成器。我希望它甚至需要几分钟,所以对于我的第一次测试,我想数秒。

【问题讨论】:

  • 这完全取决于使用的机器类型。您需要对其进行基准测试。
  • 将代码添加到基准测试中会为您的循环添加额外的步骤,从而使您的基准测试设计不准确。

标签: java


【解决方案1】:

你可以试试这个:

long startTime = System.currentTimeMillis();
long endTime = 0;

    for(int i=0; i < 1000000; i++) {

    //Something

    }

endTime = System.currentTimeMillis();

long timeneeded =  ((startTime - endTime) /1000);

【讨论】:

  • @Michael Parker:试试System.nanoTime();
  • 请注意,这种简单化的方法可能会给出误导性的答案。
  • 你为什么给endTime分配0?
  • 如果他想在方法中使用该代码。您知道局部变量不会像全局变量那样自动初始化。没有其他特殊原因。
  • 正如我所说,我这样做没有特殊原因,也完全不需要可变结束时间,我可以这样做:timeneeded = ((startTime - System.getcurrentMillis())/1000) 但我没有,没有特别的原因。
【解决方案2】:

在 Java 中编写微基准测试时需要非常小心。例如:

  • 如果 JIT 编译器可以确定循环体不会影响代码的结果,它可以将其优化掉。例如:

    for (int i = 0; i < 1000000; i++) {
       int j = i + 1;
    }
    

    很可能“跑”得很快。

  • JIT 编译后的代码运行速度更快。

  • 代码可能看起来运行很慢它正在被 JIT 编译。

  • 如果代码分配对象,那么您需要考虑由于 GC 运行、初始或最大堆大小太小等导致的测量性能的潜在可变性。

当然,性能取决于您的硬件、操作系统、JVM 的版本和补丁级别以及 JVM 启动选项。

【讨论】:

  • +1:当你有一个长循环不做任何事情时,你实际上是在计时确定循环不做任何事情需要多长时间。 ;)
【解决方案3】:

对操作进行计时的一种方法是使用 nanoTime() 取平均值。您可能需要调整迭代次数,并且平均值的变化会更小。 nanoTime 比 currentTimeMillis 更好,因为它更准确且单调递增(在应用程序运行时不会倒退)

long start = System.nanoTime();
int runs = 1000*1000;
for(int i=0;i<runs;i++) {
   // do test
}
long time = System.nanoTime() - start;
System.out.printf("The average time taken was %.1f ns%n", (double) time / runs);

使用 printf 可以格式化结果。您可以除以 1000 得到微秒或 1000000 得到微秒。

【讨论】:

    【解决方案4】:

    这取决于循环内部的操作,所以你应该做的是记录循环的开始时间和循环的结束时间,然后计算差异。您将获得循环完成所需的时间。示例:-

    long st = System.currentTimeMillis();
    
    for(int i=0; i < 1000000; i++) {
        // --- loop operation
    }
    
    System.out.print("time to execute loop"+
                         ((System.currentTimeMillis() - st) /1000));
    

    【讨论】:

    • 请注意,这种简单化的方法可能会给出误导性的答案。
    • 除非时间倒退(当你调整时钟时会发生这种情况)你的时间都是负数。
    【解决方案5】:

    将迭代次数除以10^8,你会在毫秒内得到答案 .

    【讨论】:

    • 请编辑您的答案并提供一些代码来说明应该如何做以澄清您的解释。
    【解决方案6】:

    这个java sn -p 对你很有帮助。 这是上述答案的修改版本

    long startTime = System.currentTimeMillis ();
        long startTime_2 = System.nanoTime ();
        long endTime = 0;
        int k = 0;
    
        for (int i = 0; i < 387420489; i++)
          {
          }
    
        endTime = System.currentTimeMillis ();
        long endTime_2 = System.nanoTime ();
    
        long timeneeded = (-1) * (startTime - endTime);
        long timeneeded_2 = (-1) * (startTime_2 - endTime_2);
        System.out.println (timeneeded + " in milliseconds " + timeneeded_2+" time in nanoseconds " );
    

    【讨论】:

      猜你喜欢
      • 2019-07-21
      • 2018-02-04
      • 1970-01-01
      • 2021-11-06
      • 1970-01-01
      • 2012-06-04
      • 2018-07-05
      • 2019-09-03
      • 1970-01-01
      相关资源
      最近更新 更多