我想了解是否從MappedByteBuffer類的get()方法獲得的性能是否正常。我的代碼如下:Java 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,還是我的代碼有問題?謝謝
如果您閱讀以下內容,性能會更好:while(mappedByteBuffer.hasRemaining()) { mappedByteBuffer.get()); }; ? –
如果您需要對文件進行隨機讀取/寫入訪問,內存映射文件是有意義的。如果您只是需要將數據讀入內存中,那麼我會使用普通的Java io(也許是nio頻道)。在具有內存限制的移動平臺上將4或8MB文件讀入內存也不是一個好主意。除此之外,我傾向於說有什麼不對。 SD卡(除非很便宜)應該能夠讀取至少2MB/s(2級,仍然非常便宜),而手機內部存儲應該更像20MB/s。如果您想確保它不僅僅是硬件限制 – zapl
您是否嘗試其他方法以查看您是否可以獲得更好的性能,請嘗試使用不同的實現方法? – njzk2