【问题标题】:why are java RandomAccessFile so much slower than FileOutputStream?为什么 java RandomAccessFile 比 FileOutputStream 慢这么多?
【发布时间】:2011-06-14 21:14:50
【问题描述】:

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

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

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));
  }
}

【问题讨论】:

  • 这是在哪种类型的系统/VM/磁盘上?

标签: java


【解决方案1】:

docs开始,rws模式的意思是:

打开读取和写入,与 “rw”,并且还要求每个 更新文件的内容或 元数据同步写入 底层存储设备。

按理说,强制将文件的内容写入底层设备会比其他方法慢得多,这可能允许 VM/OS 缓存写入。

【讨论】:

    【解决方案2】:

    似乎依赖于系统:我运行了您的代码并得到:

    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】:

      出于好奇,我改成 100000 次,在 Android 7.1 Zebra TC20 中测试了这段代码,得到了这些:

      writing direct 2871    
      random access write 99371    
      random access optimized write 2426
      

      【讨论】:

        猜你喜欢
        • 2013-02-01
        • 2013-06-05
        • 2019-12-05
        • 2019-06-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-11
        • 2016-10-24
        相关资源
        最近更新 更多