Я понимаю, что использование 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 мс) в семь раз быстрее, чем самое быстрое время для BufferedReader (465 мс). Как я уже говорил выше, у меня нет проблемы со значительной разницей; но такая большая разница просто кажется неразумной.
Мой вопрос: есть ли у кого-нибудь предложения по улучшению производительности BufferedReader или альтернативный механизм?
char
, чего не делает первый. Если вам нужны данныеchar
, используйтеReader
; если вам нужны байты, используйтеInputStream
. Я думаю, вы обнаружите, что быстрее всего будетBufferedReader
обернутьInputStreamReader
обернутьBufferedInputStream
обернутьFileInputStream
. Также взгляните на эту тему на как написать бенчмарк. - person Ted Hopp   schedule 13.01.2013