#file #buffered #reading #slab #performance #speed #read-file

yanked buf_file

一个支持读写操作的缓冲文件

使用旧版 Rust 2015

0.2.9 2017年8月4日
0.2.8 2017年7月23日
0.1.1 2017年7月17日

#26 in #buffered

MIT 协议

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)

Performance

这些基准测试使用版本 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

无运行时依赖