我试图了解从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卡读取数据,我寻找文档,我发现文件映射在很多情况下被认为是从文件中读取的最快方法。但是,如果我运行上面的代码,虽然缓冲区已正确填充,但性能是如此之慢(或者可能不是?你决定!!)我可以在几乎5秒内读取那些4194304字节, #39; s 每秒不到1MB 。我使用Eclipse直接连接到我的Optimus Dual智能手机;即使我将读取操作放在循环中,读取也需要相同的时间(如果执行多次读取,则可能不会进行开销初始化......不是这样)。
如果我缩小或缩小文件,此文件大小 - 时间关系不会改变:将在近9秒内读取8兆,在2秒内读取2兆,依此类推。 我读过即使是速度慢的SD卡也能以每秒至少5 MB的速度读取...... 请注意,4194304是2值的幂,因为我已经读过这会提高性能。 请告诉我你的意见:现代智能手机的实际性能是每秒1MB,还是我的代码有问题?谢谢
答案 0 :(得分:3)
在Hotspot JVM中,MappedByteBuffer.get()使用内部调用而不是本机调用。当复制大部分数据块时,它一次复制多个字节,例如MMX指令为8字节或更长。
AFAIK,Android不会这样做,这使得这个电话费用更加昂贵。
答案 1 :(得分:1)
我看不出你的代码有什么问题。它可能只是设备和/或文件系统实现的速度。正如Tom Hawtin所说“[m] emory映射的I / O不会让你的磁盘运行得更快”。