我有一个java项目要做,要求是:
创建一个循环,重复以下实验10次。完成所有10次迭代后,打印一次实验迭代的平均时间:
这是我到目前为止所做的:
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的值:”但不记录时间。我在这里做错了什么?
答案 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()方法,在另一个线程中调用剩余的逻辑,并可以控制它们的处理,以便平均时间计算逻辑运行。