无法优化的Java CPU密集型计算示例

时间:2016-01-12 02:15:07

标签: java multithreading optimization jit

首先我想澄清一下,我的问题与想要关闭JIT优化的问题How to check if the JIT compiler is off in Java不同。我希望JIT能够运行,但我想要以这样的方式编写cpu密集型任务,以至于JIT无论如何都无法优化它。现在我开始解释我的问题。 以下是由Thread运行的CPU绑定任务。我将此任务发送到我的服务器,其中来自线程池的工作人员选择并运行它。我希望工作人员在一定的时间内运行此任务,但正如我在firstsecond堆栈溢出问题中所讨论的那样,JIT会干扰并优化代码,因此工作人员会运行任意时间。我不希望工人跑不同的时间。我希望工人能够运行一段固定的时间。我应该在下面的类中编写什么类型的代码,无论如何都不能通过JIT优化。请帮助,因为这是我最后一年项目的一部分。工作范例将受到高度赞赏!

import java.math.BigInteger;    
public class CpuBoundJob  implements Runnable {     
    public void run() {    
         BigInteger factValue = BigInteger.ONE;
            long t1=System.nanoTime();      
            for ( int i = 2; i <= 800; i++){
              factValue = factValue.multiply(BigInteger.valueOf(i));
            }
        long t2=System.nanoTime();              
        System.out.println("Service Time(ms)="+((double)(t2-t1)/1000000));
    }    
}

1 个答案:

答案 0 :(得分:1)

Java中无法确保您的代码在一段精确的固定时间内运行。除了来自HotSpot(JIT)的干扰,垃圾收集器,进程中的其他线程甚至OS调度程序都会干扰应用程序的执行时间。您可以调整JIT -XX开关以尝试让JIT预编译您的代码,但我不建议这样做。你也可以使用G1软实时采集器来消除GC暂停,但最重要的是,如果你真的必须依赖这样的时间(我建议重新设计你的应用程序可能是一个更好的方法),你需要如果您的要求是真正实时的,那么至少要下载到C / C ++应用程序并可能一直到设备驱动程序级别。 Java根本不是一种实时语言。