为什么 hang() 方法只执行一次?

Why the hang() method is only getting executed for one time?

class Demo{

    static void hang(){  // Freezes/Hangs the program for some seconds.
        for(int i=0 ; i<100000 ; i++){
            for(int j=0 ; j<10000 ; j++){
                for(int k=0 ; k<10000 ; k++){
                    int b = 5%12000;
                }
            }
        }
    }

    public static void main(String a[]){
        System.out.print("Loading");
        hang();
        for(int it=0 ; it<5 ; it++)
        {
            System.out.print(".");
            hang();
        }
    }
}

hang()方法的任务是hang/freeze程序一定时间(我知道还有其他方法可以冻结程序,但我想通过使用 for 循环来显示它)。 但是当我执行这个时,第一个 hang() 调用,在 System.out.print("Loading") 下面需要一定的时间并给出延迟,for 循环中的第一个调用也会给出延迟,但其余的调用(在 for 循环中)没有花费任何时间并立即执行并且没有看到延迟。

考虑所有 hang() 调用都被调用(我已经通过在 hang() 方法中编写打印语句来检查这一点)。

考虑到每次调用 int b = 5%12000 都需要时间(甚至检查了这一点,将其替换为 if(True)

同样的代码在 C++ 中运行,即它在每个“.”之后显示延迟。

C++ 的输出就像 Loading[d].[d].[d].[d].[d].

但在 Java 中就像 Loading[d].[d]....

[d]是延迟

如果我用 hang() 方法中的整个方法代码替换 hang() 调用,它就可以工作

class Demo{

    static void hang(){  // Freezes/Hangs the program for some seconds.
        for(int i=0 ; i<100000 ; i++){
            for(int j=0 ; j<10000 ; j++){
                for(int k=0 ; k<10000 ; k++){
                    int b = 5%12000;
                }
            }
    }

    public static void main(String a[]){
        System.out.print("Loading");
        hang();
        for(int it=0 ; it<5 ; it++)
        {
            System.out.print(".");
            for(int i=0 ; i<100000 ; i++){
                for(int j=0 ; j<10000 ; j++){
                    for(int k=0 ; k<10000 ; k++){
                        int b = 5%12000;
                    }
                }
            }
        }
    }
}

一个好的优化器可以弄清楚 hang() 什么都不做——它没有副作用(除了花费时间)并且不产生任何输出。因此它优化为 'nothing'.

我怀疑这就是正在发生的事情。

您看到几次 'full' 执行的原因是即时编译器没有立即松开该例程。