5

此代码按预期打印“平均运行次数:0.99864197”

import java.util.Random;

public class A {
    public static void main(String[] args) {
        int min = -30;
        int max = 1;
        test(min, max);
    }
    static void test(int min, int max){
        int count = 0;
        Random rand = new Random(0);
        for(int j = 0; j < 2097152; j++){
            int number = min + rand.nextInt(max-min+1);
            for(int i = 0; i < number; ++i) {
                System.out.print("");
                count++;
            }
        }
        System.out.println("Average Number of Runs: " + count/65536F);

    }
}

此代码应该打印相同的确切数字,但它会打印一个随机负数。

import java.util.Random;

public class A {
    public static void main(String[] args) {
        int min = -30;
        int max = 1;
        test(min, max);
    }
    static void test(int min, int max){
        int count = 0;
        Random rand = new Random(0);
        for(int j = 0; j < 2097152; j++){
            int number = min + rand.nextInt(max-min+1);
            for(int i = 0; i < number; ++i) {
                //System.out.print("");
                count++;
            }
        }
        System.out.println("Average Number of Runs: " + count/65536F);

    }
}

java for 循环中是否发生了一些优化?

笔记:

  1. 我正在使用 jdk1.6.0_45。
  2. 在正常使用中,新的 Random 会有更好的种子。
  3. min 和 max 应该可以是任意数字。
4

2 回答 2

2

我认为这是在 Java 6 的某些版本中 JIT 处理非常紧密的循环中的一个错误。它可能错误 6196102或错误6357124

更新到 Java 7 应该可以工作,尽管我很欣赏这对您的情况没有多大帮助。您可能会发现在循环中添加“看起来不是无操作,但做了一些您不关心的事情”的方法调用也可以解决问题。例如,您可以将 的所有值相加i,然后将其打印到某个诊断日志以被忽略。

于 2013-08-04T07:43:22.323 回答
-1

它在这里工作正常openjdk 1.7.0_25 fedora-2.3.10.4.fc19-x86_64。您应该更新您的 Java 版本,或确保您的问题实际上与所述代码有关。

于 2013-08-04T07:22:33.060 回答