【问题标题】:Examples of Java CPU-intensive calculations that can not be optimized无法优化的 Java CPU 密集型计算示例
【发布时间】: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 的 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));
    }    
}

【问题讨论】:

  • 您必须在每个循环迭代中(或足够频繁地检查)并在时间到时中止计算(从run 返回)。 Java 没有很好的方法来杀死一个线程。
  • 为什么?服务的目的是什么?
  • 它的目的是测试在服务器端运行的动态线程池调优策略。我将数千个相同长度的 CPU 密集型任务提交到分布式策略,该策略将处理任务并发送响应。
  • 如果您需要花费特定时间的 CPU 密集型任务,为什么不执行 long t1 = System.nanoTime(); for (long i = 1; System.nanoTime() - t1 &lt; 10000000L, i++) { foo *= i; } 之类的操作?

标签: java multithreading optimization jit


【解决方案1】:

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

【讨论】:

猜你喜欢
  • 2011-04-11
  • 1970-01-01
  • 2015-05-19
  • 1970-01-01
  • 2016-07-31
  • 1970-01-01
  • 2014-05-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多