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

时间:2012-10-03 14:37:08

标签: 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;
        }
    }

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

399998
399999
Reached 400000    

(最后3行输出)

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

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

if(tick < 400000) {
    System.out.println(tick);
}

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

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

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

所有想法都被接受了。

5 个答案:

答案 0 :(得分:5)

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

我认为这是在另一个线程中完成的,而你并没有占用GUI线程。

答案 1 :(得分:2)

repaint()方法不会立即重新绘制组件,只是通知AWT / Swing系统重新绘制组件。因此,如果您快速拨打repaint() 10次,则很有可能只会重新粉刷一次。

现在,如果你看一下你的循环,它就不会做任何需要很长时间的事情(注意repaint()没有重新绘制)。如果你在循环中添加System.out.println()调用,它将显着增加你在循环中完成的工作。

答案 2 :(得分:1)

写入控制台是一项相对耗时的任务,特别是与什么都不做相比。这大大减慢了执行速度。如果将输出重定向到文件,则循环将比没有打印时慢,但比打印到控制台更快。

这是造成打印和不打印时执行速度差异的原因。

答案 3 :(得分:1)

尝试类似的事情,

tick++;
Thread.sleep(100);

并检查您所谓的更改是否正在发生。

答案 4 :(得分:1)

任何类型的界面比没有它的情况下慢很多倍。无论是控制台还是图形界面。这主要是因为访问图形设备所需的所有额外代码。更不用说硬件延迟了。