2014-03-02 71 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()); 

我对这些代码进行了这些更改,并且它已成功运行。