我试图了解我从MappedByteBuffer类的get()方法获得的性能是否正常。我的代码如下:

private byte[] testBuffer = new byte[4194304];
private File sdcardDir, filepath;
private FileInputStream inputStream;
private FileChannel fileChannel;
private MappedByteBuffer mappedByteBuffer;

// Obtain the root folder of the external storage
sdcardDir = Environment.getExternalStorageDirectory();

// Create the reference to the file to be read
filepath = new File(sdcardDir, "largetest.avi");
inputStream = new FileInputStream(filepath);
fileChannel = inputStream.getChannel();

mappedByteBuffer = fileChannel.map(FileChannel.MapMode.READ_ONLY, 0, (4194304));

Log.d("GFXUnpack", "Starting to read");
mappedByteBuffer.position(0);
mappedByteBuffer.get(testBuffer, 0, (4194304));
Log.d("GFXUnpack", "Ended to read");
mappedByteBuffer.rewind();

由于我是一个初学者,因此我需要最快的方法来从SD卡读取数据,因此我查找了文档,发现在许多情况下,文件映射被认为是从文件中读取的最快方法。但是,如果我运行上面的代码,尽管缓冲区已正确填充,但是性能是如此之慢(或者可能不是?您决定!!),我可以读取中的这4194304字节近5秒钟,即小于1MB第二个。我正在使用直接连接到Optimus Dual智能手机的Eclipse;即使我将读取操作放在一个循环中,读取也需要相同的时间(如果执行多次读取,则可能不会发生开销初始化...并非如此)。

如果我缩小或放大文件,此文件大小-时间关系不会改变:将在近9秒钟内读取8兆字节,在2秒钟内读取2兆字节,依此类推。
我读过,即使是慢速的SD卡,也可以以至少每秒5 MB的速度读取...
请注意,4194304是2的幂,因为我已经读到这会提高性能。
请告诉我您的意见:现代智能手机的实际性能是每秒1MB,还是我的代码有问题?谢谢

最佳答案

我看不到您的代码有什么问题。这可能只是设备和/或文件系统实现的速度。就像Tom Hawtin所说的那样:“[m]内存映射的I/O不会使磁盘运行得更快”。

10-07 17:19