2014-03-02 88 views
-3

我一直在研究一個項目,以顯示使用掃描器的讀取輸入比使用緩衝讀取器慢,這比使用我們自己的使用適當操作解析整數的函數要慢。爲此,我會在每種情況下記下執行時間以讀取輸入。JAVA:計算運行時錯誤的執行時間

long startTime,endTime,duration; 

startTime=System.nanoTime(); 
/* Reading input via scanner */  
endTime=System.nanoTime(); 
duration = endTime - startTime; 
System.out.println(duration); 

startTime=System.nanoTime(); 
/* Reading input via buffered reader */  
endTime=System.nanoTime(); 
duration = endTime - startTime; 
System.out.println(duration); 

startTime=System.nanoTime(); 
/* Reading input via own function for I/O */  
endTime=System.nanoTime(); 
duration = endTime - startTime; 
System.out.println(duration); 

我得到運行時錯誤在上面的代碼,如果我嘗試運行在一個程序中所有三個。但是,如果我一次只使用一種方法,則可以正常工作。我懷疑在計算執行時間方面存在一些問題。請幫忙。

這裏是我的代碼http://ideone.com/BwvAXr

+2

你可以發佈堆棧跟蹤嗎?你發表評論的代碼可能是問題的根源。請張貼,以及。 – bknopper

+2

如果您不會告訴我們錯誤是什麼,那麼很難提供幫助。 – kdgregory

+0

在我看來,錯誤來自讀取輸入的代碼。你是從'stdin'讀取還是打開一個文件?你對每種方法使用單獨的文件閱讀器嗎?如果是這樣,你怎麼打開它,你記得關閉它嗎? –

回答

1

你的代碼假定Scanner只消耗盡可能多的,它實際上需要輸入流。但是,似乎掃描儀實際上是緩衝輸入。換句話說,當您嘗試使用InputReader讀取第二行輸入時,Scanner已經從標準輸入讀取並將其存儲在緩衝區中。所以當你的InputReader試圖從標準輸入讀取時,沒有數據需要讀取。

您的代碼使用BufferedReader很可能會做出相同的假設。

對每個測試使用單獨的輸入流而不是共享流將會更好。這樣,您就不必擔心一臺閱讀器從一個流中讀取了多少數據,然後再將其傳遞給下一個閱讀器。 System.in對此不是一個好的選擇,因爲只有其中之一。最好使用諸如ByteArrayInputStream之類的流,它會從字節數組中創建一個InputStream。例如,你可以使用的方法,如以下爲測試目的創建流:

// Add this to your Main class. 
    private static InputStream getTestStream() { 
     return new ByteArrayInputStream("1 2 3 4 5 6 7 8 9 10".getBytes(Charset.forName("UTF-8"))); 
    } 

你可以這樣設置你的ScannerInputReader(還有一個BufferedReader)使用此方法的調用:

InputReader in = new InputReader(getTestStream()); 
    // ... 
    Scanner sc=new Scanner(getTestStream()); 

我對這些代碼進行了這些更改,並且它已成功運行。