2012-10-03 97 views
3

我有一個switch語句一個while循環:添加System.out.println()會減慢執行速度(很多)?

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出,櫃檯通常是有的在130K左右,我看到它移動到了400K。

但是,如果我刪除if語句打印此號碼:

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

加載屏幕永遠不會發生變化,而當我ALT + TAB出來,已經達到了400K。

另外好奇的是,加載屏幕有三個'外觀變化',一個是100個調用paintComponent方法,一個是200個調用,另一個是300個調用,將計數器重置爲0.所以基本上,每100個滴答它應該有一個外觀變化。在第一種情況下,if語句具有較長的執行時間,但我看到了這些變化,但遠遠沒有我期望的那麼頻繁。在第二種情況下,我根本沒有看到它們(我可以想象它們會發生得太快)。

所以我的問題是,什麼在執行時間造成了這麼大的差異,什麼導致了paintComponent方法似乎被調用的次數的差異,以及循環迭代的400.000倍?

所有的想法appreceated。

+0

[This](http://stackoverflow.com/questions/4120528/repaint-in-a-loop)應該有所幫助。 – st0le

回答

4

寫入控制檯,特別是MS-DOS控制檯,速度非常慢。你應該儘量保持你寫入控制檯的行數最少。如果你不得不寫很多數據,我建議你把它寫到一個文件中,因爲它可以快得多。

我認爲這是在另一個線程中完成的,而不是綁定GUI線程。

+0

令人難以置信的(至少對我來說)如何寫入控制檯顯然比寫入文件慢得多..無論如何感謝您的洞察力。但是,while循環的迭代次數和contentPane中的paintComponent被調用的次數也有所不同。我只是添加了一行打印paintComponent被執行的頻率的計數器,並且每次都會變化。在400K while()迭代中,該方法似乎被稱爲255(最低結果)至677(最高結果)倍。它涉及到屏幕上的變化量,這是6次。你能解釋一下嗎? –

+0

GUI盡力忽略虛假的繪畫調用。只要它比實際需要的數量多,而且不會太多就沒有問題。 –

+0

如果您考慮在屏幕上打印一個字符所需的工作量,例如處理字體,其寫入文件的速度要慢於寫入不需要對每個字符做任何事情的文件,這並不奇怪。令人驚訝的是,MS-DOS窗口比同一臺機器上的Swing GUI或xterm(運行Linux)慢得多。 –

2

repaint()方法不會立即重新繪製組件,只是指示AWT/Swing系統重新繪製組件。因此,如果您快速撥打repaint() 10次,那麼很可能只會重新繪製一次。

現在,如果你看看你的循環,它不需要很長時間(注意repaint()不重繪)。如果您在循環中添加System.out.println()調用,它將顯着增加循環中要完成的工作。

+0

感謝您的解釋:) –

1

寫入控制檯是一項相對耗時的工作,尤其是與無所事事相比。這大大減緩了執行速度。如果將輸出重定向到文件,則循環會比沒有打印時慢,但比打印到控制檯上要快。

這是造成執行速度差異很大的原因,無論是否打印。

+0

現在我知道爲什麼要將調試結果寫入文件!感謝您的貢獻:)。 –

1

嘗試類似,

tick++; 
Thread.sleep(100); 

,並檢查您應該變化是否正在發生。

+0

剛剛添加它,結果全部正常。把印刷品拿出來稍微短一些。現在讓它進入睡眠狀態(1),這已經顯着減慢了它的速度,看看兩個計數器是否因此而變得更接近彼此。會回來這個。 –

+0

在while循環的400K迭代中,paintComponent現在使用sleep(1)調用45662次。此行爲由上面的其他答覆者解釋。感謝您的貢獻! –

+0

歡迎,你有沒有解決你的問題呢? –

1

任何類型的接口比沒有接口時要慢很多倍。無論是控制檯還是圖形界面。這主要是因爲訪問圖形設備所需的所有額外代碼。更不用說硬件延遲了。