Я занимаюсь небольшим профилированием алгоритмов, и я решил протестировать три метода чтения файлов, а затем проверить их (сравнить их среднее время выполнения). Сначала я генерировать larde текстовый файл (несколько сотен MBS), а затем запустить десять тестов для каждого метода - забуференный читателя, нормальный IO чтения, и память отображается чтение:Тестирование различных методов чтения файлов в Java
public static void bufferedRead(String filename) {
BufferedReader br = null;
try {
String sCurrentLine;
br = new BufferedReader(new FileReader(filename));
while ((sCurrentLine = br.readLine()) != null) {
System.out.println(sCurrentLine);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (br != null)
br.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
public static void NIORead(String filename) throws IOException {
RandomAccessFile aFile = new RandomAccessFile(filename, "r");
FileChannel inChannel = aFile.getChannel();
ByteBuffer buffer = ByteBuffer.allocate(1024);
while (inChannel.read(buffer) > 0) {
buffer.flip();
for (int i = 0; i < buffer.limit(); i++) {
System.out.print((char) buffer.get());
}
buffer.clear();
}
inChannel.close();
aFile.close();
}
public static void memoryMapRead(String filename) throws IOException {
RandomAccessFile aFile = new RandomAccessFile(filename, "r");
FileChannel inChannel = aFile.getChannel();
MappedByteBuffer buffer = inChannel.map(FileChannel.MapMode.READ_ONLY,
0, inChannel.size());
buffer.load();
for (int i = 0; i < buffer.limit(); i++) {
System.out.print((char) buffer.get());
}
buffer.clear();
inChannel.close();
aFile.close();
}
Тем не менее, весь процесс (3x10 измерений) занимает очень много времени, например, 9 часов или около того. Правда, у меня нет SSD-диска, но все же мне кажется очень долго, даже для 400-мегабайтного текстового файла. Мой вопрос: являются ли эти временные результаты правдоподобными? Если нет, есть ли что-то, что выглядит неправильно в этих реализациях?
Я бы настоятельно рекомендовал использовать ['Files.lines()'] (https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html # lines-java.nio.file.Path-) и забыть всю эту глупость. Узким местом для любого чтения файла будет IO, а не код. Также, пожалуйста, научитесь использовать 'try-with-resources', чтобы гарантировать правильное закрытие ваших ресурсов. –
Вы пытались удалить 'System.out.println'? Печатание материалов на консоль (особенно, если все остальные операции быстрые) может значительно замедлить работу вашей программы. – Turing85
@ Turing85 не имеет значения. Сдерживающим фактором будет диск IO здесь. –