Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
近乎空的Java For循环行为奇怪_Java_Debugging_Loops_Jvm_Nested Loops - Fatal编程技术网

近乎空的Java For循环行为奇怪

近乎空的Java For循环行为奇怪,java,debugging,loops,jvm,nested-loops,Java,Debugging,Loops,Jvm,Nested Loops,此代码按预期打印“平均运行次数:0.99864197” import java.util.Random; 公共A类{ 公共静态void main(字符串[]args){ int min=-30; int max=1; 试验(最小值、最大值); } 静态孔隙试验(最小值为int,最大值为int){ 整数计数=0; 随机随机数=新随机数(0); 对于(int j=0;j

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

import java.util.Random;
公共A类{
公共静态void main(字符串[]args){
int min=-30;
int max=1;
试验(最小值、最大值);
}
静态孔隙试验(最小值为int,最大值为int){
整数计数=0;
随机随机数=新随机数(0);
对于(int j=0;j<2097152;j++){
整数=min+rand.nextInt(max-min+1);
对于(int i=0;i
这段代码应该打印相同的精确数字,但它会打印一个随机的负数

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;
公共A类{
公共静态void main(字符串[]args){
int min=-30;
int max=1;
试验(最小值、最大值);
}
静态孔隙试验(最小值为int,最大值为int){
整数计数=0;
随机随机数=新随机数(0);
对于(int j=0;j<2097152;j++){
整数=min+rand.nextInt(max-min+1);
对于(int i=0;i
java中是否存在一些针对循环的优化

注:

  • 我使用的是jdk1.6.0_45
  • 在正常使用中,新的随机数将有一个更好的种子
  • 最小值和最大值应该可以是任意数字

  • 它在openjdk 1.7.0_25 fedora-2.3.10.4.fc19-x86_64上运行良好。
    您应该更新您的Java版本,或者确保您的问题实际上与所述的代码有关。

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


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

    我似乎记得这是一个重复的值,但我怀疑我很难找到它。我认为这是1.6中的一个JIT错误,它在Java7中得到了修复。你能在Java 7上试用吗?@JonSkeet我刚刚在Java 7上试用过,效果非常好。在jre 7u25上运行代码似乎可以解决这个问题,所以在Java 6中它似乎确实是一个bug。这种情况很糟糕,因为minecraft社区中有相当多的人似乎不知道如何更新,而这段代码是我一直在进行的游戏修改的一部分。。。另外@Jon Skeet你能发布一个答案,这样我就可以把它标记为已接受吗?@ZaideChris:可以,尽管我不确定它是否值得这么多…这两个代码版本在java 1.6.026上都能完美工作。
    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);
    
        }
    }