gpt4 book ai didi

Java MappedByteBuffer.get() 出奇的慢

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:05:48 25 4
gpt4 key购买 nike

我试图了解我从 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 字节,那是每秒小于 1MB。我正在使用直接连接到我的 Optimus Dual 智能手机的 Eclipse;即使我将读取操作放在一个循环中,读取也需要相同的时间(如果执行多次读取,可能不会发生开销初始化......并非如此)。

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

最佳答案

毫无值(value)的是,在 Hotspot JVM 中,MappedByteBuffer.get() 使用内部调用而不是 native 调用。当复制大段数据 block 时,它会一次复制多个字节,例如8 个字节或更长的 MMX 指令。

据我所知,Android 不会这样做,这使得此调用成本更高。

关于Java MappedByteBuffer.get() 出奇的慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13473461/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com