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

标签 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 运行此代码三次(每个测试一个方法)。

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

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

Java 1.6.0_65

Macbook Air 13 英寸,2013 年末

最佳答案

在查看了各种评论后,未能一致地复制该行为。我断定这确实是JRE的侥幸。感谢这些评论,我了解到这种方式的基准测试不是很有用,我应该使用微基准测试框架(例如 Google 的 caliper)来测试如此微小的差异。

我找到的一些资源:

  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

关于java - 三元条件导致 Java 中奇怪的 CPU 使用率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24974482/

相关文章:

三元运算符里面的Java Ternary Operator,如何求值?

java - 你会使用 AOP 来跟踪积分吗?

java - `Leaderboard` 选项卡未显示在 Google Play 游戏中,而 `Achievements` 选项卡存在

java - 如何在 Android 上设置 HttpPut 的主体? (不添加库)

java - 从 vector < vector <字符串>>动态更新JTable

C 解析/proc/stat 以计算每个核心的当前 CPU 使用率

linux - Linux核心转储是否有线程CPU使用信息

java - 静态字段的资源使用情况

c# - 在 Entity Framework 中使用三元条件运算符或表达式

c++ - 按位和/或使用三元运算符