在写入文件时,android中的延迟峰值

时间:2015-01-23 13:49:56

标签: android performance testing file-io latency

我正在运行一些性能测试,并在测试结果中看到一些峰值。 这是我用来衡量写入文件的时间的代码。

public class Test extends AndroidTestCase {

private DecimalFormat decimalFormat = new DecimalFormat("#.##");
private final Boolean isInternal = true;

public void testWrite() {
    Thread thread = new Thread() {
        public void run() {
            File dummy_file = createFile("dummy2", true);
            File file = createFile("normal_write", isInternal);
            for (int i = 0; i < 12500; i++) {
                long start = System.nanoTime();
                write(dummy_file, String.valueOf(i));
                long stop = System.nanoTime();
                double mSec = ((double) (stop - start) / 1000000.0);
                write(file, decimalFormat.format(mSec));
            }
        }
    };

    thread.start();

    try {
        thread.join();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

public File createFile(String fileName, Boolean isInternal) {
    deleteFile(fileName, isInternal);
    try {
        String file_path = "";
        if(isInternal == true) {
            file_path = getContext().getFilesDir().getAbsolutePath() + "/" + fileName + ".dat";
        } else {
            file_path = Environment.getExternalStorageDirectory() + "/" + fileName + ".dat";
        }
        File file = new File(file_path);
        file.createNewFile();
        FileWriter fw = new FileWriter(file.getAbsoluteFile(), true);
        BufferedWriter bw = new BufferedWriter(fw);
        bw.write("##;##\n" +
                "@LiveGraph demo file.\n" +
                "Time");
        bw.newLine();
        bw.close();
        return file;
    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;
}

public void deleteFile(String fileName, Boolean isInternal) {
    String file_path = "";
    if ( isInternal == true) {
        file_path = getContext().getFilesDir().getAbsolutePath() + "/" + fileName + ".dat";
    } else {
        file_path = Environment.getExternalStorageDirectory() + "/" + fileName + ".dat";
    }
    File file = new File(file_path);
    file.delete();
}

public void write(File file, String content) {
    try {
        FileWriter fw = new FileWriter(file.getAbsoluteFile(), true);
        BufferedWriter bw = new BufferedWriter(fw);
        bw.write(content);
        bw.newLine();
        bw.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

}

大部分时间写入的时间是~0.1-0.2ms,但是有些峰值需要10+ ms,并且无法弄清楚这是什么原因。我现在无法在此处链接图表,因为我是新用户。

我真的坚持这个想法吗?。

这是时间测量的一部分。

0.16 0.16 0.17 0.15 0.15 2.5 0.17 0.16 0.16 0.16 0.15 0.17 0.17 0.17 0.19 0.19 0.17 0.2 0 0 4.79 0.24 0.23 0.28 0.23 0.28 0.03 0 11.23 0.16 0.15 0.18 0.16 0.16 0.17 0.16 5.84

1 个答案:

答案 0 :(得分:0)

它可能与Android的存储访问细节有关:

  

手机上磁盘的背景等等,点击时有什么问题   磁盘? Android设备都在运行闪存,对吧?这就像   一个没有移动部件的超高速SSD?我不应该关心?   不幸的是,你做到了。

     

您不能依赖大多数闪存组件或文件系统   Android设备要始终如一。使用的YAFFS文件系统   例如,许多Android设备都有全局锁定   操作。整个过程中只能进行一次磁盘操作   设备。即使是简单的“统计”操作也可能需要一段时间   不走运其他设备采用更传统的基于块设备   当块旋转层时,文件系统仍偶尔受到影响   决定垃圾收集并做一些缓慢的内部闪存擦除   操作。 (对于一些好的令人讨厌的背景阅读,请参阅   lwn.net/Articles/353411)

     

外卖是移动设备上的“磁盘”(或文件系统)   通常很快,但90%的延迟往往很差。   此外,大多数文件系统因为它们变得更加饱满而减慢了很多。   (请参阅Google I / O Zippy Android应用说明中的幻灯片,链接关闭   code.google.com/p/zippy-android)

http://android-developers.blogspot.com/2010/12/new-gingerbread-api-strictmode.html