Я изучаю возможность перезаписи некоторого кода, который узким местом на диске записывает в java. В javadoc не ясно, почему первые два цикла кода ниже будут работать так иначе, чем вторые два цикла:
public void testFileChannel() throws IOException {
RandomAccessFile raf = new RandomAccessFile(new File("/tmp/t5"),"rw");
FileChannel c = raf.getChannel();
c.force(true);
ByteBuffer b = ByteBuffer.allocateDirect(64*1024);
long s = System.currentTimeMillis();
for(int i=0;i<size;i++){
b.clear();
b.put(data.getBytes());
b.flip();
c.write(b);
}
long e=System.currentTimeMillis();
raf.close();
System.out.println("FileChannel rw force=true "+(e-s));
raf = new RandomAccessFile(new File("/tmp/t5"),"rw");
raf.seek(0);
c = raf.getChannel();
c.force(false);
b = ByteBuffer.allocateDirect(64*1024);
s = System.currentTimeMillis();
for(int i=0;i<size;i++){
b.clear();
b.put(data.getBytes());
b.flip();
c.write(b);
}
e=System.currentTimeMillis();
raf.close();
System.out.println("FileChannel rw force=false "+(e-s));
raf = new RandomAccessFile(new File("/tmp/t5"),"rwd");
raf.seek(0);
c = raf.getChannel();
c.force(true);
b = ByteBuffer.allocateDirect(64*1024);
s = System.currentTimeMillis();
for(int i=0;i<size;i++){
b.clear();
b.put(data.getBytes());
b.flip();
c.write(b);
}
e=System.currentTimeMillis();
raf.close();
System.out.println("FileChannel rwd force=true "+(e-s));
raf = new RandomAccessFile(new File("/tmp/t5"),"rwd");
raf.seek(0);
c = raf.getChannel();
c.force(true);
b = ByteBuffer.allocateDirect(64*1024);
s = System.currentTimeMillis();
for(int i=0;i<size;i++){
b.clear();
b.put(data.getBytes());
b.flip();
c.write(b);
}
e=System.currentTimeMillis();
raf.close();
System.out.println("FileChannel rws force=true "+(e-s));
}
public static final int size = 10000;
public static final String data = "123456789012345678901234567890";
Запуск этого кода дает что-то вроде этого:
FileChannel rw force=true 273
FileChannel rw force=false 40 // Forcing writes to disk is slower than above.
FileChannel rwd force=true 4179 // Why is this slower?!
FileChannel rwd force=true 4212
Как видите, c.force(true)
немного замедляет работу. Почему все должно замедляться больше при использовании режима RandomAccessFile
"rwd". Не должны ли "rwd" и c.force(true)
быть эквивалентными.