三元条件导致Java中奇怪的CPU使用率

时间:2014-07-26 18:59:20

标签: java cpu-usage ternary-operator

我正在运行这段代码来比较3种计算环绕坐标的等效方法的性能:

public class Test {
    private static final float MAX = 1000000;

    public static void main(String[] args) {
        long time = System.currentTimeMillis();
        for (float i = -MAX; i <= MAX; i++) {
            for (float j = 100; j < 10000; j++) {
                method1(i, j);
                //method2(i, j);
                //method3(i, j);
            }
        }
        System.out.println(System.currentTimeMillis() - time);
    }

    private static float method1(float value, float max) {
        value %= max + 1;
        return (value < 0) ? value + max : value;
    }

    private static float method2(float value, float max) {
        value %= max + 1;
        if (value < 0)
            value += max;
        return value;
    }

    private static float method3(float value, float max) {
        return ((value % max) + max) % max;
    }
}

我使用method1,method2和method3(每个测试一个方法)运行此代码三次。

奇怪的是,方法1产生了几个java进程,并设法利用了近100%的双核cpu,而method2和method3只产生了1个进程,因此只能占用我的cpu的25%(因为有4个虚拟核心)。为什么会这样?

以下是我的机器的详细信息:

Java 1.6.0_65

Macbook Air 13&#34; 2013年末

1 个答案:

答案 0 :(得分:1)

在审核各种评论后,无法始终如一地复制行为。我已经确定这确实是JRE的侥幸。感谢这些评论,我了解到以这种方式进行基准测试并不是很有用,我应该使用微基准框架(如Google的卡尺)来测试这些微小的差异。

我发现了一些资源:

  1. Google's java micro-benchmark page
  2. IBM page discussing a flawed benchmark and common pitfalls
  3. Oracle's page on micro-benchmarking
  4. Stackoverflow question on micro-benchmarking