使用system.currentimemillis来测量计算输出所需的时间

时间:2017-09-19 16:37:55

标签: java time java.util.scanner

我有一个java项目要做,要求是:

创建一个循环,重复以下实验10次。完成所有10次迭代后,打印一次实验迭代的平均时间:

  • 从0到n选择一个随机数r。
  • 使用System类,记下实验的开始时间
  • 在循环中重复乘以两个9位数值进行r次迭代。你不需要保留 这种乘法的结果。
  • 请注意实验的结束时间

这是我到目前为止所做的:

package lee_lab02;
import java.util.Random;
import java.util.Scanner;

public class Benchmark {

public Benchmark() {
}

public static void main(String[] args) {
    System.out.println("Please enter a value for n:");
    Scanner scan = new Scanner(System.in);
    int n = scan.nextInt();
    long start = System.currentTimeMillis();
    for(int i=1; i<=10; i++)
    {

        Random rand = new Random();
        double r = rand.nextInt(n);
        for(int z=1;z<r;z++)
        {
            long num1 = 145893123;
            long num2 = 901234278;
            long num3 = num1 * num2;
        }
    }
    long end = System.currentTimeMillis();
    long totTime = end - start;
    long avg = totTime/10;
    System.out.println(avg);
}

}

此输出提示我“请输入n的值:”但不记录时间。我在这里做错了什么?

3 个答案:

答案 0 :(得分:0)

您的计划没有任何问题。只是你在for循环中执行琐碎的操作,而不需要花费太多时间。所有迭代都在不到1毫秒的时间内完成。只需在Thread.sleep(500);循环中添加for,您就会看到平均值按预期打印。

另外,对double使用avg。 (double avg = totTime/10.0;)。

答案 1 :(得分:0)

要执行此类基准测试,最好使用nanoTime()(请记住1 000 000ns = 1ms(currentTimeMillis)),除非您的程序需要超过 10秒< / em>在这种情况下以ms为单位获取时间就足够了(但仍然可以使用nanoTime()):

long start = System.nanoTime();
int nbRound = 10;
for (int i = 1; i <= nbRound; i++) {
   //...
}
long end = System.nanoTime();
long totTime = end - start;
long avg = totTime / nbRound;
System.out.println(avg);

我还添加了一个变量nbRound,因为它很快就会出错并在循环和平均值的计算中写出不同的值,所以当你可以更好地使用变量

因为你的程序做了一件小事,你需要将n设置为高值,我的测试:

  • n=100 ==&gt; 105 673ns
  • n=100000 ==&gt; 1 720 963ns (1.7ms)

答案 2 :(得分:0)

scan.nextInt()方法是一种阻塞方法。因此,您当前的线程阻塞,代码永远不会前进以执行剩余的代码行。

您需要稍微更改设计以处理nextInt()方法的阻塞。您可以在另一个线程中调用nextInt()方法,在另一个线程中调用剩余的逻辑,并可以控制它们的处理,以便平均时间计算逻辑运行。