2015-02-10 2 views
1

У меня создалось впечатление, что использование FileChannel и BytBuffer ускорит время чтения, но, похоже, значительно медленнее, чем чтение из потока. Я здесь что-то не так?ли каналы медленно читают?

FileInputStream fis = new FileInputStream("C:\\Users\\blah\\Desktop\\del\\pg28054.txt"); 
     FileOutputStream fos = new FileOutputStream("C:\\Users\\blah\\Desktop\\del\\readme.txt"); 

     FileChannel fcin = fis.getChannel(); 
     FileChannel fcout = fos.getChannel(); 

     ByteBuffer buffer = ByteBuffer.allocate(1024); 
     long startTime = System.currentTimeMillis(); 
     long endtime = System.currentTimeMillis(); 
     while(true){ 
      buffer.clear(); 
      int r = fcin.read(buffer); 
      if(r==-1){ 
       break; 
      } 
      buffer.flip(); 
      fcout.write(buffer); 
     } 
     endtime = System.currentTimeMillis(); 
     System.out.println("time to read and write(ms) " + (endtime - startTime)); 

Вышеприведенные завершается в 108 мс, где находятся ниже реализация делает это в 43 мс

 long startTime; 
     long endtime; 
     FileInputStream fis1 = new FileInputStream("C:\\Users\\blah\\Desktop\\del\\pg28054.txt"); 
     FileOutputStream fos1 = new FileOutputStream("C:\\Users\\blah\\Desktop\\del\\readme1.txt"); 

     byte b[] = null; 

     startTime = System.currentTimeMillis(); 
     while(true){ 
      b = new byte[1024]; 
      int r = fis1.read(b); 
      if(r==-1){ 
       break; 
      } 
      fos1.write(b); 
     } 

     endtime = System.currentTimeMillis(); 
     System.out.println("time to read and write(ms) " + (endtime - startTime)); 
+0

Обычные вопросы относятся к микрообнаружениям: вы неоднократно запускали эксперименты в JVM, предоставляя достаточное время для работы JIT? Вы использовали '--XX: + PrintCompilation', чтобы подтвердить, что JIT был тих для прогонов, значения которых вы использовали? Одно из первых соображений состоит в том, что первый блок кода может приводить к большему количеству классов (что требует больших накладных расходов), даже если эти классы приводят к более быстрому коду, когда они были JIT'ed и таковыми. – yshavit

+0

Это пограничный обман http://stackoverflow.com/questions/504103/how-do-i-write-a-correct-micro-benchmark-in-java – yshavit

+0

Немного больше информации было бы хорошо - какие размеры ваши файлы. Как вы выполняете свои тесты. –

ответ

2

Помимо очень точные замечания относительно качества вашего теста, нет ничего о каналах или ByteBuffers это по своей сути быстрее, чем потоки. Есть варианты, которые могут заставить вещи работать быстрее. Например, вы можете использовать метод FileChannel.transferFrom для передачи содержимого. Другим примером может быть использование directByteBuffer для передачи содержимого.

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