性能:BufferedOutputStream与Java中的FileOutputStream

时间:2017-04-20 19:15:11

标签: java

我已经读过BufferedOutputStream类可以提高效率,并且必须以这种方式与FileOutputStream一起使用 -

BufferedOutputStream bout = new BufferedOutputStream(new FileOutputStream("myfile.txt"));

并且对于写入同一文件下面的语句也是有效的 -

FileOutputStream fout = new FileOutputStream("myfile.txt");

但推荐的方法是使用Buffer进行读/写操作,这也是我更喜欢使用Buffer的原因。

但我的问题是如何衡量上述两种陈述的表现。是他们的任何工具或某种东西,不知道到底是什么?但这对分析它的表现很有用。

作为JAVA语言的新手,我很想知道它。

2 个答案:

答案 0 :(得分:4)

只有在您进行低效的阅读或写作时,缓冲才有用。对于读取,即使只使用read(byte [])或read(char [])可以更快地吞噬字节/字符,也可以逐行读取。对于写入,它允许您使用缓冲区缓冲要通过I / O发送的内容,并仅在刷新时发送它们(请参阅PrintWriter(PrintOutputStream(?)。setAutoFlush())

但如果您只是尽可能快地尝试读取或写入,则缓冲不会提高性能

有关从文件中有效读取的示例:

File f = ...;
FileInputStream in = new FileInputStream(f);
byte[] bytes = new byte[(int) f.length()]; // file.length needs to be less than 4 gigs :)
in.read(bytes); // this isn't guaranteed by the API but I've found it works in every situation I've tried

效率低下阅读:

File f = ...;
BufferedReader in = new BufferedReader(f);
String line = null;
while ((line = in.readLine()) != null) {
  // If every readline call was reading directly from the FS / Hard drive,
  // it would slow things down tremendously. That's why having a buffer 
  //capture the file contents and effectively reading from the buffer is
  //more efficient
}

答案 1 :(得分:2)

这些数字来自使用SSD的MacBook Pro笔记本电脑。

  • BufferedFileStreamArrayBatchRead(809716.60-911577.03 bytes / ms)
  • BufferedFileStreamPerByte(136072.94 bytes / ms)
  • FileInputStreamArrayBatchRead(121817.52-1022494.89 bytes / ms)
  • FileInputStreamByteBufferRead(118287.20-1094091.90 bytes / ms)
  • FileInputStreamDirectByteBufferRead(130701.87-956937.80 bytes / ms)
  • FileInputStreamReadPerByte(1155.47 bytes / ms)
  • RandomAccessFileArrayBatchRead(120670.93-786782.06 bytes / ms)
  • RandomAccessFileReadPerByte(1171.73 bytes / ms)

如果数字中有一个范围,则根据所用缓冲区的大小而有所不同。较大的缓冲区可以提高到某一点的速度,通常在硬件和操作系统内的缓存大小附近。

如您所见,单独读取字节总是很慢。将读取批处理成块很容易。它可以是每毫秒1k和每毫秒136k(或更多)之间的差异。

这些数字有点陈旧,它们会因设置而异,但它们会给你一个想法。可以找到生成数字的代码here,编辑Main.java以选择要运行的测试。

编写基准的优秀(且更严格)框架是JMH。可以找到学习如何使用JMH的教程here