为什么 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' 执行的原因是即时编译器没有立即松开该例程。
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' 执行的原因是即时编译器没有立即松开该例程。