使用旧版 Rust 2015
0.2.9 |
|
---|---|
0.2.8 |
|
0.1.1 |
|
#26 in #buffered
94KB
487 lines
BufFile-rs
为 Rust 开发的支持读写操作的缓冲文件。
默认情况下,每个“热点”(在代码中称为 slab)的大小为 512kb,这可以通过将 file_buffer.rs 移入你的 Rust 项目中,而不是使用 crate,非常容易地改变。
性能
在适当的条件下,BufFile 可以比 BufReader 和 BufWriter,或者 BufReader 和 BufWriter 的组合表现得更好。如 src/lib.rs 中的非常简单的基准测试所示(以 buf_file 结尾的测试使用 BufFile,其他使用 BufReader 或 BufWriter)
这些基准测试使用版本 0.2.8。
这些示例中的性能提升很可能归因于 BufFile 的更大默认缓存大小,但与 BufReader 和 BufWriter 相比,在随机访问文件中使用时,性能提升更加显著,并不仅仅是由于更大的缓存大小(使用这两个组件本身就比较繁琐)。
示例用法
此示例有些晦涩,但它展示了 BufFile 的相对速度
Cargo.toml
[dependencies]
buf_file = "0.2.8"
some_file.rs
use std::time::{ SystemTime };
use std::io::{ Error, Seek, SeekFrom, Write, Read, BufWriter};
use std::fs::{ File, OpenOptions };
use buf_file::*;
let num_mb = 128;
let dat = vec![1u8; 1024];
// Write some data using a BufWriter, time it
let mut t2 = OpenOptions::new().read(true).write(true).truncate(true).create(true).open("xasd.tree").unwrap();
let mut file2 = BufWriter::new(t2);
let now = SystemTime::now();
for i in 0..num_mb * 1024 {
file2.write(&dat[0..]).unwrap();
}
match now.elapsed() {
Ok(a) => {
let seconds = a.as_secs() as f64 + (a.subsec_nanos() as f64 / 1e9f64);
println!("time to write {} megabytes with BufWriter: {:?}\n{} mb / s WRITE", num_mb, seconds, num_mb as f64 / seconds);
},
Err(_) => panic!("Error measuring time.."),
};
// Write some data using a BufFile, time it
let mut t1 = OpenOptions::new().read(true).write(true).truncate(true).create(true).open("test.tree").unwrap();
let mut file = BufFile::with_capacity(8, t1).unwrap();
let now = SystemTime::now();
for i in 0..num_mb * 1024 {
file.write(&dat[0..]).unwrap();
}
match now.elapsed() {
Ok(a) => {
let seconds = a.as_secs() as f64 + (a.subsec_nanos() as f64 / 1e9f64);
println!("time to write {} megabytes with BufFile: {:?}\n{} mb / s WRITE", num_mb, seconds, num_mb as f64 / seconds);
},
Err(_) => panic!("Error measuring time.."),
};
// Sample output (from output on windows x64, with an SSD):
//
// time to write 128 megabytes with BufWriter: 0.1323519
// 967.1187191117015 mb / s WRITE
// time to write 128 megabytes with BufFile: 0.1970247
// 649.6647374669268 mb / s WRITE