首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java MappedByteBuffer.get()非常慢

Java MappedByteBuffer.get()非常慢
EN

Stack Overflow用户
提问于 2012-11-20 12:42:34
回答 2查看 1.9K关注 0票数 6

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

代码语言:javascript
复制
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 /秒。我使用的是直接连接到擎天柱双智能手机的Eclipse;即使我将读取操作放在一个循环中,读取也需要相同的时间(如果多个读取为performed...Not,则可能不会发生开销初始化)。

如果我减少或使文件变大,这个文件大小-时间关系不会改变:8 megs将在将近9秒内读取,2 megs在2秒内读取,等等。我读过,即使是一个缓慢的SD卡,也可以以每秒至少5 MB的速度读取.请注意,4194304是2值的幂,因为我已经读到这会提高性能。请告诉我你的观点:每秒1MB是现代智能手机的实际性能吗?还是我的代码有问题?谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-20 13:02:39

我看不出你的代码有什么问题。这可能只是设备和/或文件系统实现的速度。正如Tom Hawtin所说,“内存映射I/O不会使磁盘运行得更快”。

票数 1
EN

Stack Overflow用户

发布于 2012-11-20 13:07:06

在Hotspot JVM中,MappedByteBuffer.get()使用的是内部调用而不是本机调用,这一点都不值钱。当复制大段数据块时,它一次复制多个字节,例如,使用MMX指令复制8个字节或更长的字节。

AFAIK,Android不这么做,这使得这个电话更加昂贵。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13473461

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档