【问题标题】:Why would the same code be shorter inside a for loop?为什么相同的代码在 for 循环中会更短?
【发布时间】:2016-04-12 22:14:25
【问题描述】:

所以我编写了一个相当愚蠢的程序,只是为了稍微使用 nanoTime。我希望能够检查少量代码的执行时间,所以我认为 nanoTime 是最好的。我想确定这段代码的平均执行时间,所以我把它放在一个 for 循环中。然而,当在 for 循环中时,平均下降到大约 6,000 纳秒。我知道这对小代码来说并没有太大的区别,但我很好奇为什么对于相同的确切代码会有任何不同? 这是产生不同时间的两个块: 这个平均约为 8064 纳秒:

  long start, end, totalTime;
  double milliseconds, seconds, minutes, hours, days, years;
  totalTime = 0;

  start = System.nanoTime();
  milliseconds = System.currentTimeMillis();
  seconds = milliseconds/1000;
  minutes = seconds/60;
  hours = minutes/60;
  days = hours/24;
  years = days/365;
  end = System.nanoTime();
  totalTime = end-start;

而这个平均约为 2200 纳秒:

  long start, end, totalTime;
  double milliseconds, seconds, minutes, hours, days, years;
  totalTime = 0;


  for(int i = 1; i < 11; i++){
     start = System.nanoTime();
     milliseconds = System.currentTimeMillis();
     seconds = milliseconds/1000;
     minutes = seconds/60;
     hours = minutes/60;
     days = hours/24;
     years = days/365;
     end = System.nanoTime();
     totalTime += end-start;
     System.out.println(end-start); //this was added to manually calc. the average to 
    //make sure the code was executing properly. does not effect execution time.
  }

然后求平均总时间*.1

【问题讨论】:

  • totalTime*.01 是什么意思? totalTime 除以 100?..
  • 开始:shipilev.net/blog/2014/nanotrusting-nanotime 开玩笑 ;-) 这相当复杂。然而,这个问题很可能被认为是 stackoverflow.com/questions/16970191/… 的重复(可能还有其他几十个......他们仍然一次又一次地回答......)
  • 1.您不应该期望 nanotime 的任何准确性,因为 Java 不保证它:“此方法提供纳秒精度,但不一定提供纳秒精度。不保证值更改的频率。”。 2. 如果你正常运行相同的代码多次,由于 JIT 优化,它会随着时间的推移执行得更快。
  • @alan7678 我刚刚注意到我打错了。它应该是 *.1。我这样做而不是 /10 因为如果我这样做 /10 我会失去平均值的小数部分。损失不大,但我喜欢看到确切的时间。
  • @YaroslavRudykh 我没想到每次运行都会产生完全相同的时间。我确实知道每次运行都会略有不同,因此我想找到平均运行时间 - 话虽如此,感谢您的输入!

标签: java nanotime


【解决方案1】:

这正是您对任何 Java 程序的期望。 Java 运行时,特别是 JIT 编译器,将在程序的生命周期内运行得越多,就越会优化代码。您应该期望代码在多次运行后加速。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-20
    • 1970-01-01
    • 2021-05-29
    • 1970-01-01
    相关资源
    最近更新 更多