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.
请注意,除了等待一秒钟之外,您的代码正在执行操作.它正在为for循环输入代码,设置变量以跟踪它并进行迭代.但更重要的是,您必须了解您的系统还发生了什么.
您的操作系统有一个称为调度程序的东西,它决定在任何给定时间运行的程序('进程')访问CPU.如果某个程序(如您的程序)进入休眠状态(定义为"至少在x单位时间内不执行任何操作"),则调度程序通常会将其切换为另一个程序(您运行的程序很多) .当它重新切换回来时是非确定性的.因此,即使您恰好在接近一秒标记(可能是)时切换回来,它也不可能完全在一秒钟之内.因此,"改进"这段代码永远无法帮助解决需要精确一秒循环的潜在问题.
另请注意,调度程序可以随时切换程序:程序无需自愿进入休眠状态.这是调度程序的任务; 仲裁哪些进程可以在任何特定点访问系统资源.因此,时间分析,特别是在这种半实现方式中,并不是特别有用.使用IDE探查器可以获得更好的想法,因为它们可以测量墙壁时间等内容.