簡體   English   中英

性能:Java中的BufferedOutputStream與FileOutputStream

[英]Performance : BufferedOutputStream vs FileOutputStream in Java

我已經讀到BufferedOutputStream類可以提高效率,並且必須以這種方式與FileOutputStream一起使用-

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

對於下面的語句寫入同一文件也是有效的-

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

但是推薦的方法是使用Buffer進行讀/寫操作,這就是為什么我只更喜歡使用Buffer的原因。

但是我的問題是如何衡量上述2條語句的性能。 他們是任何工具還是某種東西,不知道到底是什么? 但這對於分析其性能很有用。

作為JAVA語言的新手,我很想知道它。

緩沖僅在您的讀寫效率低下時才有用。 對於閱讀而言,即使僅使用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
}

這些數字來自使用SSD的MacBook Pro筆記本電腦。

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

在數字范圍內的地方,它會根據所使用的緩沖區的大小而變化。 較大的緩沖區可以使速度提高到一定程度,通常在硬件和操作系統內的高速緩存大小附近。

如您所見,單獨讀取字節總是很慢。 將讀取分為幾批很容易。 它可以是1k / ms和136k / ms(或更多)之間的差。

這些數字有些陳舊,根據設置的不同,它們會有很大的不同,但是它們會給您一個想法。 可以在此處找到用於生成數字的代碼,編輯Main.java以選擇要運行的測試。

JMH是一個出色的(更嚴格)基准測試框架。 這里可以找到學習如何使用JMH的教程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM