簡體   English   中英

為什么BufferedReader的性能比BufferedInputStream差得多?

[英]Why is the performance of BufferedReader so much worse than BufferedInputStream?

我知道使用BufferedReader(包裝FileReader)將比使用BufferedInputStream(包裝FileInputStream)慢得多,因為原始字節必須轉換為字符。 但我不明白為什么它這么慢! 以下是我正在使用的兩個代碼示例:

BufferedInputStream inputStream = new BufferedInputStream(new FileInputStream(filename));
try {
  byte[] byteBuffer = new byte[bufferSize];
  int numberOfBytes;
  do {
    numberOfBytes = inputStream.read(byteBuffer, 0, bufferSize);
  } while (numberOfBytes >= 0);
}
finally {
  inputStream.close();
}

和:

BufferedReader reader = new BufferedReader(new FileReader(filename), bufferSize);
try {
  char[] charBuffer = new char[bufferSize];
  int numberOfChars;
  do {
    numberOfChars = reader.read(charBuffer, 0, bufferSize);
  } while (numberOfChars >= 0);
}
finally {
  reader.close();
}

我已嘗試使用各種緩沖區大小的測試,所有緩沖區大小均為150兆字節的文件。 以下是結果(緩沖區大小以字節為單位;時間以毫秒為單位):

Buffer   Input
  Size  Stream  Reader
 4,096    145     497
 8,192    125     465
16,384     95     515
32,768     74     506
65,536     64     531

可以看出,BufferedInputStream(64 ms)的最快時間比BufferedReader(465 ms)的最快時間快7倍。 如上所述,我沒有一個顯着差異的問題; 但這種差異似乎是不合理的。

我的問題是:有沒有人建議如何提高BufferedReader的性能,或者另一種機制?

BufferedReader已將字節轉換為字符。 相對於數據塊的直接副本,逐字節解析和復制到更大類型是昂貴的。

byte[] bytes = new byte[150 * 1024 * 1024];
Arrays.fill(bytes, (byte) '\n');

for (int i = 0; i < 10; i++) {
    long start = System.nanoTime();
    StandardCharsets.UTF_8.decode(ByteBuffer.wrap(bytes));
    long time = System.nanoTime() - start;
    System.out.printf("Time to decode %,d MB was %,d ms%n",
            bytes.length / 1024 / 1024, time / 1000000);
}

版畫

Time to decode 150 MB was 226 ms
Time to decode 150 MB was 167 ms

注意:必須與系統調用混合使用會降低兩個操作的速度(因為系統調用可能會干擾緩存)

在BufferedReader實現中,有一個固定常量defaultExpectedLineLength = 80 ,在分配StringBuffer時用於readLine方法。 如果你的大文件有很多長於80的行,那么這個片段可能是可以改進的

if (s == null) 
    s = new StringBuffer(defaultExpectedLineLength);
s.append(cb, startChar, i - startChar);

暫無
暫無

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

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