多线程Java应用程序中的执行时间测量

5

我搜索了有关Java应用程序执行时间测量的信息,并得到了以下代码:

long start= System.currentTimeMillis();
//TODO
long stop= System.currentTimeMillis();

开始时间和结束时间之间的差值给我执行时间。

注意:我知道这不是精确的执行时间。我只需要用于多线程和单线程应用程序之间比较的时间。

如果我像这样更改我的代码会怎样:

long start= System.currentTimeMillis();
//something...
Thread t1= new Thread(new blabla(0, 10), "T - 1");
t1.start();
Thread t2= new Thread(new blabla(10, 20), "T - 2");
t2.start();
//Consider I've 10 threads like this
//something more
long stop = System.currentTimeMillis();

有10个线程在执行,不管它们做什么。比方说,它们随机地填充一个2D数组。

现在,停止-启动会给我“全部”的执行时间吗?还是我必须单独测量每个线程的时间?


你使用的Java版本是哪个? - Nicolas Filotto
2个回答

4
您的多线程示例并不能按照您的意愿正常工作,因为当您在一个线程上调用start()时,它将并发运行。基本上发生的情况是您启动了所有10个线程,但可能没有一个线程在您调用之前就开始执行工作。
long stop = System.currentTimeMillis();

如果您想测量任务完成所需的完整运行时间,必须等待所有线程完成,可以按照以下方式执行:

long start = System.currentTimeMillis();

List<Thread> threads = new ArrayList<>();

for (int i = 0; i < 10; ++i) {
    Thread t = new Thread(new blabla(i * 10, (i + 1) * 10), "T - " + (i + 1));
    t.start();
    threads.add(t);
}

// and now wait for all of them to complete
for (Thread t : threads) {
    t.join();
}

long stop = System.currentTimeMillis();

请注意,这仅在线程执行后终止时起作用(即您的 blabla 可运行程序不会在无限循环中运行或类似情况下)。
或者你可以使用 ExecutorService(例如 Executors.newFixedThreadPool(10),请参见 Java API)来提交任务并等待所有任务的终止。

我非常确定我的1-5毫秒的结果是错误的。此外,Eclipse控制台会写入 - 例如 - 5毫秒。但终止按钮仍然可用。线程当然在工作。现在我尝试了你的方法,结果很有意义。当然,我不能百分之百地测量,但即使我调整线程计数,我也能看到差异。谢谢。 - Diga
1
你可以另外一种方式来测量应用程序的运行时间,但只适用于想要在隔离环境中(即使用专用main()方法)测试性能的情况:在main()启动时保存开始时间,然后通过System.getRuntime().addShutdownHook()注册一个关闭挂钩。当JVM终止时,它将被调用,在那里你可以再次获取时间并通过减去开始时间来打印出运行时间。 - svenpanko

0
    final long startTime = System.currentTimeMillis();

    // do multi threaded work

    Runtime.getRuntime().addShutdownHook(new Thread(() -> {
        System.out.println("Shutdown Hook is running !");
        final long endTime = System.currentTimeMillis();
        System.out.println("Calculated in: " + (endTime - startTime) / 1000 + " seconds" );
    }));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接