2015-04-12 8 views
0

Я занимаюсь небольшим профилированием алгоритмов, и я решил протестировать три метода чтения файлов, а затем проверить их (сравнить их среднее время выполнения). Сначала я генерировать 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-мегабайтного текстового файла. Мой вопрос: являются ли эти временные результаты правдоподобными? Если нет, есть ли что-то, что выглядит неправильно в этих реализациях?

+0

Я бы настоятельно рекомендовал использовать ['Files.lines()'] (https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html # lines-java.nio.file.Path-) и забыть всю эту глупость. Узким местом для любого чтения файла будет IO, а не код. Также, пожалуйста, научитесь использовать 'try-with-resources', чтобы гарантировать правильное закрытие ваших ресурсов. –

+0

Вы пытались удалить 'System.out.println'? Печатание материалов на консоль (особенно, если все остальные операции быстрые) может значительно замедлить работу вашей программы. – Turing85

+0

@ Turing85 не имеет значения. Сдерживающим фактором будет диск IO здесь. –

ответ

1

Удаление System.out.println(...) может улучшить производительность вашего теста, но обязательно сделайте что-нибудь с чтением String, чтобы циклы не оптимизировались.

 Смежные вопросы

  • Нет связанных вопросов^_^