To compare file I/O performance between C and Rust, I write \"test\" to a file 100,000,000 times and read 4 bytes from a file 100,000,000 times.
Compared to C, the R
My Rust program was not using buffered IO. Thanks to BurntSushi5 and Andrew Henle's comments, the problem is solved.
$ strace ./rswrite
write(3, "test", 4) = 4
write(3, "test", 4) = 4
...
$ strace ./rswrite
read(3, "test", 4) = 4
read(3, "test", 4) = 4
...
I modified the code:
use std::fs;
use std::io::{BufWriter, Write};
fn main() {
let b = b"test";
/**** Use std::io::BufWriter ****/
let mut f = BufWriter::new(fs::File::create("rs.dump").unwrap());
for _ in 0 .. 100_000_000 {
f.write(b).unwrap();
}
}
and
use std::{fs, mem};
use std::io::{BufReader, Read};
fn main() {
/**** Use std::io::BufReader ****/
let mut f = BufReader::new(fs::File::open("rs.dump").unwrap());
let mut b: [u8; 4] = unsafe { mem::uninitialized() };
for _ in 0 .. 100_000_000 {
f.read_exact(&mut b).unwrap();
}
}
Now, I/O is buffered.
write(3, "testtesttesttesttesttesttesttest"..., 8192) = 8192
write(3, "testtesttesttesttesttesttesttest"..., 8192) = 8192
...
The performance is as fast as C.
$ time ./rswrite
real 0m1.341s
user 0m0.213s
sys 0m0.200s
$ time ./rsread_buf
real 0m0.596s
user 0m0.540s
sys 0m0.050s