【发布时间】:2016-01-12 16:18:06
【问题描述】:
首先,我想明确一点,我的问题与How to check if the JIT compiler is off in Java 的问题不同,后者希望 jo 关闭 JIT 优化。我希望 JIT 运行,但我希望以 JIT 无论如何都无法优化它的方式编写 CPU 密集型任务。现在我开始解释我的问题。 以下是由线程运行的 CPU 绑定任务。我将此任务发送到我的服务器,线程池中的工作人员将其选中并运行它。我希望工作人员在某个固定的时间内运行此任务,但正如我在 stack-overflow 的 first 和 second 问题中所讨论的那样,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));
}
}
【问题讨论】:
-
您必须在每个循环迭代中(或足够频繁地检查)并在时间到时中止计算(从
run返回)。 Java 没有很好的方法来杀死一个线程。 -
为什么?服务的目的是什么?
-
它的目的是测试在服务器端运行的动态线程池调优策略。我将数千个相同长度的 CPU 密集型任务提交到分布式策略,该策略将处理任务并发送响应。
-
如果您需要花费特定时间的 CPU 密集型任务,为什么不执行
long t1 = System.nanoTime(); for (long i = 1; System.nanoTime() - t1 < 10000000L, i++) { foo *= i; }之类的操作?
标签: java multithreading optimization jit