ディスク上のボトルネックがJavaに書き込むコードを書き直す可能性を調査しています。javadocは、以下の最初の2つのコードループが次の2つのループとは異なるパフォーマンスを示す理由を明確にしていません。
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)
はならず、同等です。