Rust file I/O is very slow compared with C. Is something wrong?

后端 未结 1 793
死守一世寂寞
死守一世寂寞 2020-12-17 17:31

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

相关标签:
1条回答
  • 2020-12-17 17:55

    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
    
    0 讨论(0)
提交回复
热议问题