2011-06-14 78 views
3

只要我能理解java api,使用“rw”打开RandomAccessFile不会在底层存储设备上同步写入单个单字节。与“rws”或“rwd”不同。
为什么它与“rw”无缓冲FileOutputStream几乎相同的“速度”和“rws”/“rwd”慢10倍以上?为什么java RandomAccessFile比FileOutputStream慢得多?

下面的简单代码显示了这一点,我无法得到任何合理的解释。任何线索?

import java.io.File; 
import java.io.FileOutputStream; 
import java.io.OutputStream; 
import java.io.RandomAccessFile; 

public class StreamTest { 

    public static void main(String[] args) throws Exception { 

    OutputStream os; 
    RandomAccessFile raf; 
    int size = 10000; 
    File file = new File("test.log"); 

    long a=System.currentTimeMillis(); 
    os = new FileOutputStream(file); 
    for(int i=0;i<size;i++){ 
     os.write(("1").getBytes()); 
    } 
    os.close();  
    long b=System.currentTimeMillis(); 
    System.out.println("writing direct "+(b-a)); 

    raf = new RandomAccessFile(file,"rws"); 
    for(int i=0;i<size;i++){    
     raf.write(("1").getBytes()); 
    } 
    raf.close(); 

    long c=System.currentTimeMillis(); 
    System.out.println("random access write "+(c-b)); 

    raf = new RandomAccessFile(file,"rw"); 
    for(int i=0;i<size;i++){    
     raf.write(("1").getBytes()); 
    } 
    raf.close(); 

    long d=System.currentTimeMillis(); 
    System.out.println("random access optimized write "+(d-c)); 
    } 
} 
+0

这是哪种类型的系统/虚拟机/磁盘? – 2011-06-14 21:18:38

回答

0

看来是依赖于系统的:我跑了你的代码,并得到:

writing direct 116 
random access write 611 
random access optimized write 39 

操作系统:Linux 2.6.9

JVM:

java version "1.6.0" 
Java(TM) SE Runtime Environment (build 1.6.0-b105) 
Java HotSpot(TM) Server VM (build 1.6.0-b105, mixed mode) 
3

docs, rws模式表示:

打开阅读和写作,与 “RW”,同时还要求每个 更新文件的内容或 元数据同步写入到 底层存储设备。

强迫文件内容写入底层设备的原因明显慢于其他方法,这可能会使VM/OS缓存写入。

相关问题