【问题标题】:reader vs buffered reader阅读器与缓冲阅读器
【发布时间】:2023-03-28 23:34:01
【问题描述】:

假设BufferedReader 的缓冲区大小与cbuf 相同,在FileReaderBufferedReader 之间调用read(char[] cbuf) 会有什么性能差异。

我知道每次进行本机调用以读取每个字符时,对FileReader 的简单read() 调用都会变慢。

FileReader 上的read(char[] cbuf) 将读取cbuf 字符大小,只需一个与BufferedReader 类似的本机调用。

如果在FileReaderBufferedReader 上使用read(char[] cbuf) 方法,那么性能会有什么不同。

【问题讨论】:

  • 你试过测量吗?

标签: java bufferedreader


【解决方案1】:

FileReader 上的 read(char[] cbuf) 只需一个与 BufferedReader 类似的本机调用即可读取 cbuf 大小的字符。

这是不正确的。没有读入 Java char[] 数组的本机调用。 FileReader 实际上是一个 InputStreamReader 分层在 FileInputStream. InputStreamReader 运行一个 8k 内部缓冲区。所以文件一次被读取多达 8k。

如果在 FileReaderBufferedReader 上使用 read(char[] cbuf) 方法,性能会有什么不同。

您会看到BufferedReader 由于双缓冲而导致读取缓冲区速度较慢的意见,但它们是不正确的。 BufferedReader 检测到这种情况并在可能的情况下直接读取。

简而言之,您不会注意到差异。

【讨论】:

  • 缓冲两次。 BufferedReader 有一个内部缓冲区,你正在读入的 char[] 是另一个。
【解决方案2】:

计划:BufferedReader 会消耗一些空间,因此典型用途可以消耗更少的时间。

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

  • 读取操作的大小、时间和位置(如果每次读取都在缓冲区长度之后进行查找怎么办?);
  • 计算硬件、原生软件和 JVM;
  • 您是否可以普遍预测您的应用程序;
  • 和(为了得到 JIT 编译和其他运行时优化的好处)是否 您的读取操作是可预测的或不可预测的、突发的或持续的。

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

您没有提到维护软件的问题,但总的来说,这是值得考虑的软件生命周期成本的主要部分。维护使用标准库的代码比重新发明相同功能的代码更容易。

【讨论】:

    猜你喜欢
    • 2017-09-23
    • 1970-01-01
    • 2011-10-23
    • 2023-03-23
    • 1970-01-01
    • 2018-06-14
    • 2020-10-24
    • 2015-02-06
    • 1970-01-01
    相关资源
    最近更新 更多