我一直在研究一个项目,表明使用Scanner读取输入比使用缓冲读取器慢,而缓冲读取器的速度比使用我们自己的函数慢,后者使用合适的操作解析整数。为此,我注意到在每种情况下读取输入的执行时间。
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
答案 0 :(得分: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")));
}
然后,您可以使用此方法调用来设置Scanner
和InputReader
(以及BufferedReader
):
InputReader in = new InputReader(getTestStream());
// ...
Scanner sc=new Scanner(getTestStream());
我对您的代码进行了这些更改,并且运行成功。