添加System.out.println()会减慢执行速度(很多)?

Mar*_*ans 4 java while-loop

我有一个带有switch语句的while循环:

while(true) {
        switch(state) {
        case LOADING :
            //THIS IS THE IMPORTANT PART
            //view loading screen (already set by default)
            contentPane.repaint();
            if(tick == 400000) {
                //state = GameState.MENU;
                System.out.println("Reached " + gameTick);
            }
            break;
        case MENU :
            //view menu
            break;
        //some other cases without content, left them out here
        }
        tick++;
        if(tick < 400000) {
                System.out.println(tick);
        }
        if(tick == Long.MAX_VALUE) {
            tick = 0;
        }
    }
Run Code Online (Sandbox Code Playgroud)

现在这个代码执行得很好,它显示了加载屏幕(只要重复调用它重复调用就会在其上移动点,所以我确切知道它何时停止),并且输出计数从1到400000以及该数字版画

399998
399999
Reached 400000    
Run Code Online (Sandbox Code Playgroud)

(最后3行输出)

应用程序全屏显示,当我alt + tab out时,计数器通常在130K左右,我看它移动到400K.

但是,如果我删除打印此数字的if语句:

if(tick < 400000) {
    System.out.println(tick);
}
Run Code Online (Sandbox Code Playgroud)

加载屏幕永远不会移动,当我alt + tab out时,已经达到了400K.

同样好奇的是加载屏幕有三个"外观变化",一个是100个调用它的paintComponent方法,一个是200个调用,一个是300个调用,它将计数器重置为0.所以基本上,每100个滴答它应该有外观变化.在第一种情况下,使用if语句,执行时间较长,我看到了更改,但到目前为止并没有像我期望的那样频繁.在第二种情况下,我根本看不到它们(我可以想象它们会发生得太快).

所以我的问题是,是什么造成了执行时间的这个相当大的差异,是什么导致paintComponent方法似乎被调用的次数差异,以及循环迭代的400.000倍?

所有的想法都被接受了.

Pet*_*rey 5

写入控制台,尤其是MS-DOS控制台,速度非常慢.您应该尽量将写入控制台的行数保持在最低限度.如果你必须写很多数据,我建议你把它写到一个文件,因为它可以明显更快.

我假设这是在另一个线程中完成的,而你并没有占用GUI线程.