2016-04-25 170 views
4

我已經從我的Java編程書中得到了一個簡單的程序,只是添加了一點。System.out.print導致延遲?

package personal; 

public class SpeedTest { 
    public static void main(String[] args) { 
    double DELAY = 5000; 
    long startTime = System.currentTimeMillis(); 
    long endTime = (long)(startTime + DELAY); 
    long index = 0; 

    while (true) { 
     double x = Math.sqrt(index); 
     long now = System.currentTimeMillis(); 
     if (now >= endTime) { 
     break; 
     } 
     index++; 
    } 
    System.out.println(index + " loops in " + (DELAY/1000) + " seconds."); 
    } 
} 

這將返回128478180 loops in 5.0 seconds.

如果我的if語句前加上System.out.println(x);,然後我在5秒內循環次數下降到400,000,是由於System.out.println()延遲?還是隻是x沒有被計算,當我不打印出來?

+8

打印到控制檯必須是最差的事情,你可以做性能明智的。 IO操作需要很長時間。 – Tunaki

+0

System.out.println是一個IO操作,是的,它可以影響任何程序的性能 – Sanjeev

+6

好的問題,我不明白downvotes。僅僅因爲這對你來說是微不足道的,並不意味着你應該倒下。 – Maroun

回答

0

每當一個非常繁忙的環路內你「做輸出」,在任何編程語言無論如何,你介紹兩種可能,極顯著延遲:

  1. 必須將數據轉換爲可打印字符,然後寫入它可能要去的任何顯示器/設備......並且...
  2. 「輸出任何東西的動作」強制進程​​使其與任何其他進程同步正在產生輸出。

通常用於此目的的一種替代策略是「跟蹤表」。這是一個內存數組,一些固定大小的包含字符串的。條目以「循環」方式添加到此表中:最舊的條目不斷被最新條目取代。該策略提供歷史而不需要輸出。(剩下的唯一要求是,任何人都被添加到表中的條目,或從中讀取,必須使用一個互斥同步他們的活動例如。)

進程希望通過顯示的內容trace-table應該抓住互斥鎖,製作感興趣內容的內存中副本,然後在準備輸出之前釋放互斥鎖。通過這種方式,對跟蹤表貢獻條目的各種過程不會因與I/O相關的延遲源而延遲。