解析40MB文件的速度明显慢于等效的Pascal代码


use std::fs::File;
use std::io::Read;
fn main() {
let mut f = File::open("binary_file_path").expect("no file found");
let mut buf = vec![0u8;15000*707*4];
f.read(&mut buf).expect("Something went berserk");
let result: Vec<_> = buf.chunks(2).map(|chunk| i16::from_le_bytes([chunk[0],chunk[1]])).collect();
}

我想读一个二进制文件。最后一行大约需要15秒。我希望它只需要几分之一秒。如何优化它?

您的代码看起来编译器应该能够对其进行适当的优化。请确保使用cargo build --release在发布模式下编译它。将40MB的数据转换为本机端序应该只需要几分之一秒。

使用byeteorder机箱可以简化代码并节省一些不必要的复制。它为Read的所有实现者定义了一个扩展特性,允许您在文件对象上直接调用read_i16_into()

use byteorder::{LittleEndian, ReadBytesExt};
use std::fs::File;
let mut f = File::open("binary_file_path").expect("no file found");
let mut result = vec![0i16; 15000 * 707 * 2];
f.read_i16_into::<LittleEndian>(&mut result).unwrap();

cargo build --release提高了的性能

最新更新