所以我正在为Androids创建一个基准测试应用程序。现在我正在尝试添加测试内部存储读/写速度的功能。为了测试读取速度,我首先创建了一个文件(几兆字节)。接下来,我在5秒内尽可能多次地读回文件,然后计算速度。
下面是示例代码,演示了我的代码的简化版本。我从代码中得到的输出(在Galaxy S4上)是:
File Size (should be 4096kb): 4096kb
Total Read: 3137792 MB
Read Rate: 612.85 MB/sec
这显然太快了,不可能是真的(我希望它在30-60MB的范围内)。
测试代码:
private void readTest()
{
final int FILE_SIZE = 1024 * 1024 * 4;
final int CHUNK_SIZE = 1024 * 128;
final int CHUNK_NUM = FILE_SIZE / CHUNK_SIZE;
final int READ_DURATION = 5000;
File outputDir = Globals.getContext().getCacheDir();
try
{
File tempFile = File.createTempFile("InternalStorageRead", "tmp", outputDir);
// Generate some data to write to temp file
byte[] buffer = new byte[CHUNK_SIZE];
for (int i = 0; i < CHUNK_SIZE; i++)
{
buffer[i] = (byte)((i % 256) - 128);
}
// Write generated data into file
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(tempFile));
for (int i = 0; i < CHUNK_NUM; i++)
{
bos.write(buffer);
bos.flush();
}
bos.close();
System.out.println("File Size (should be " + (FILE_SIZE / 1024) + "kb): " + (tempFile.length() / 1024) + "kb");
long startTimeMS = System.currentTimeMillis();
FileInputStream is = new FileInputStream(tempFile);
long bytesRead = 0;
while (System.currentTimeMillis() - startTimeMS < READ_DURATION)
{
for (int i = 0; i < 10; i++)
{
int read = is.read(buffer);
if (read > 0)
{
bytesRead += read;
}
else
{
// EOF - start reading again from beginning
is.close();
is = new FileInputStream(tempFile);
}
}
}
is.close();
double mb = bytesRead / (1024.0 * 1024.0);
System.out.println("Total Read: " + (bytesRead / 1024) + " MB");
double readRate = mb / (READ_DURATION / 1000.0);
System.out.println("Read Rate: " + readRate + " MB/sec");
}
catch (IOException e1)
{
e1.printStackTrace();
return;
}
}
我的代码似乎有什么问题(我错过了什么,或者编译器优化),还是安卓系统的问题?就像内存缓存或类似性质的东西。
您的数据被缓存在RAM中,因此您可以从那里测量速度。您需要打开文件进行直接I/O,以避免缓存。然后,一些更高版本的Android或硬件设备不允许在内部驱动器上进行此操作。此外,驱动器的路径也不是标准的。请参阅我的DriveSpeed部分:
http://www.roylongbottom.org.uk/android%20benchmarks.htm#anchor17
在那里,您可以获得带有内部和外部驱动器按钮的DriveSpeed.apk,以及不删除测试文件的选项。关闭和打开电源会清除缓存,并且可以从驱动器中测量读取(一次)。你可以安排用3个程序来做到这一点,一个要写,一个读,一个删除。
还有DriveSpd2.apk,您可以在其中输入要使用的路径。
带有Java和JNI/C代码的Eclipse项目在中
http://www.roylongbottom.org.uk/Android%20Benchmarks.zip