測試文件大小 1,253,244 字節,分別使用三種方式讀取並累加字節值:
| 讀取方式 | 耗時 | 說明 |
|---|---|---|
FileInputStream.read() | 1464 ms | 單字節讀取,系統調用開銷極大 |
BufferedInputStream.read() | 72 ms | 帶緩衝區,減少系統調用次數 |
MappedByteBuffer | 25 ms | 內存映射,直接操作內存區域 |
若去除累加運算僅測試讀取循環,差距更明顯:1458 ms / 67 ms / 8 ms。
// 內存映射文件讀取
MappedByteBuffer buffer = new RandomAccessFile(file, "rw")
.getChannel()
.map(FileChannel.MapMode.READ_WRITE, 0, file.length());
// 直接遍歷內存區域
for (int i = 0; i < file.length(); i++) {
byte b = buffer.get(i);
// 處理數據...
}
force() 強制刷新。-Xmx 限制,但計入進程 RSS,需監控物理內存使用。