2013-03-04 270 views
2

假设BufferedReader的缓冲区大小与cbuf的大小相同,和BufferedReader之间调用read(char[] cbuf)时的性能差异是多少。阅读器vs缓冲阅读器

我知道FileReader上的一个简单的read()调用在每次本机调用读取每个字符时都会变慢。

read(char[] cbuf)FileReader将读取cbuf字符的大小只有一个本地调用,这是类似于BufferedReader

如果在FileReaderBufferedReader上使用read(char[] cbuf)方法,那么会有任何性能差异。

+2

您是否尝试过测量? – 2013-03-04 20:35:56

回答

2

FileReader上的read(char [] cbuf)只会用一个与BufferedReader类似的本地调用来读取chars的cbuf大小。

这是不正确的。没有读入Java char[]阵列的本机调用。一个FileReader实际上是一个InputStreamReader分层覆盖一个FileInputStream.InputStreamReader运行一个8k内部缓冲区。因此,该文件一次最多可以读取8k。

所以会有任何性能差,如果读(烧焦[] CBUF)上正在使用FileReader VS BufferedReader方法。

您会读到BufferedReader由于双缓冲而缓慢读入缓冲区的意见,但它们不正确。 BufferedReader检测到这种情况,并在可能的情况下直接进行读取。

总之,你不会注意到一个区别。

+1

什么是双缓冲? – vjk 2013-03-05 16:42:22

+0

缓冲两次。 BufferedReader有一个内部缓冲区,而你读入的char []是另一个。 – EJP 2013-03-05 19:19:01

1

该计划:BufferedReader消耗一些空间,所以典型的使用可以消耗更少的时间。

但衡量它,因为性能结果取决于下列事项:

  • 大小,时间和位置读操作(如果有什么每个读不在一个寻求刚刚过去的缓冲区长度? );
  • 计算硬件,原生软件和JVM;
  • 您是否可以普遍预测那些适合您的应用程序;
  • 和(为了得到 JIT编译和其他运行时优化的好处)是否 您的读取操作是可预测的或不可预测的,突发或持续的。

此外,性能结果的重要性取决于您的应用程序的功能要求。

您没有提及维护软件的问题,但通常值得考虑作为软件生命周期成本的主要部分。维护使用标准库的代码比重新实现相同功能的代码更容易。