Near empty Java For-Loop acts strange

北城以北 提交于 2020-01-14 09:08:17

问题


This code acts as expected printing "Average Number of Runs: 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);

    }
}

This code that should print the same exact number, but instead it prints a random negative number.

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);

    }
}

Is there some optimization that happens in java for loops?

Notes:

  1. I'm using jdk1.6.0_45.
  2. In normal usage the new Random would have a better seed.
  3. min and max should be able to be any number.

回答1:


I believe this to be a bug in the JIT handling of very tight loops in some versions of Java 6. It may be either bug 6196102 or bug 6357124.

Updating to Java 7 should work, although I appreciate that doesn't help much in your situation. You may find that adding a "looks like it isn't a no-op, but does something you don't care about" method call within your loop fixes the problem too. For example, you could sum all the values of i, and print that to some diagnostic log afterwards to be ignored.




回答2:


It works fine here on openjdk 1.7.0_25 fedora-2.3.10.4.fc19-x86_64. You should update your Java version, or ensure that your problem is actually with the code as stated.



来源:https://stackoverflow.com/questions/18040592/near-empty-java-for-loop-acts-strange

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!