在Java中需要多长时间?用Java测量延迟时间

Mar*_*szS 4 java performance benchmarking for-loop real-time

我不想更改此代码,我只对JVM,OS或内核定制/配置感兴趣以获得最佳结果!


我有一个第二个循环(1000 x 1ms)

public static void main(String[] args) throws InterruptedException {
    long start = System.nanoTime();
    for (int i = 0; i < 1000; i++ ) {
        Thread.sleep(TimeUnit.MILLISECONDS.toMillis(1));
    }
    long duration = System.nanoTime()  - start;
    System.out.println("Loop duration " + 
         duration / TimeUnit.MILLISECONDS.toNanos(1) + " ms.");
}
Run Code Online (Sandbox Code Playgroud)

在我的带有内核3.12的Fedora 20上,这个循环需要1055毫秒.

这是相当不错的结果,平均超过1100ms.

是否可以使用自定义JVM标志或操作系统配置更快地使用此代码?

Loop duration 1055 ms.
Run Code Online (Sandbox Code Playgroud)

Sve*_*rev 14

调用sleep()你基本上是告诉操作系统暂停你的线程至少X毫秒.无法保证在此时间之后它将继续执行,或者操作系统稍后会重新构建您的线程.此外,最短的sleep时间和精度在很大程度上取决于操作系统.

编辑:另外你应该考虑到你的情况,(很可能)你的代码正在被解释!JAva仅编译为本机代码hotspots(并且从此处出​​现Hotspot JIT的名称),这些代码经常被执行.对于serverVM,这是给定代码的10k执行.你只有1k.

  • @MariuszS如果你想要它更快,请少睡觉. (2认同)

Nat*_*ord 6

请注意,除了等待一秒钟之外,您的代码正在执行操作.它正在为for循环输入代码,设置变量以跟踪它并进行迭代.但更重要的是,您必须了解您的系统还发生了什么.

您的操作系统有一个称为调度程序的东西,它决定在任何给定时间运行的程序('进程')访问CPU.如果某个程序(如您的程序)进入休眠状态(定义为"至少在x单位时间内不执行任何操作"),则调度程序通常会将其切换为另一个程序(您运行的程序很多) .当它重新切换回来时是非确定性的.因此,即使您恰好在接近一秒标记(可能是)时切换回来,它也不可能完全在一秒钟之内.因此,"改进"这段代码永远无法帮助解决需要精确一秒循环的潜在问题.

另请注意,调度程序可以随时切换程序:程序无需自愿进入休眠状态.这是调度程序的任务; 仲裁哪些进程可以在任何特定点访问系统资源.因此,时间分析,特别是在这种半实现方式中,并不是特别有用.使用IDE探查器可以获得更好的想法,因为它们可以测量墙壁时间等内容.