我正在运行一些性能测试,并在测试结果中看到一些峰值。 这是我用来衡量写入文件的时间的代码。
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
答案 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