У меня создалось впечатление, что использование 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));
Обычные вопросы относятся к микрообнаружениям: вы неоднократно запускали эксперименты в JVM, предоставляя достаточное время для работы JIT? Вы использовали '--XX: + PrintCompilation', чтобы подтвердить, что JIT был тих для прогонов, значения которых вы использовали? Одно из первых соображений состоит в том, что первый блок кода может приводить к большему количеству классов (что требует больших накладных расходов), даже если эти классы приводят к более быстрому коду, когда они были JIT'ed и таковыми. – yshavit
Это пограничный обман http://stackoverflow.com/questions/504103/how-do-i-write-a-correct-micro-benchmark-in-java – yshavit
Немного больше информации было бы хорошо - какие размеры ваши файлы. Как вы выполняете свои тесты. –