gpt4 book ai didi

performance - 与 C 相比,Rust 文件 I/O 非常慢。有什么问题吗?

转载 作者:行者123 更新时间:2023-11-29 07:43:02 25 4
gpt4 key购买 nike

为了比较 C 和 Rust 之间的文件 I/O 性能,我将“测试”写入文件 100,000,000 次,并从文件中读取 4 个字节 100,000,000 次。

与 C 相比,Rust 代码花费了系统时间的 450 多倍用于写入,140 倍用于读取。

我怀疑有更好的方法来实现快速 I/O;如何在 Rust 中提高文件 I/O 的性能?

$ rustc --version
rustc 1.16.0
$ rustc rswrite.rs -C opt-level=3 # Rust for writing
$ time ./rswrite
real 1m8.411s
user 0m3.817s
sys 1m4.533s
$ rustc rsread.rs -C opt-level=3 # Rust for reading
$ time ./rsread
real 0m18.077s
user 0m2.130s
sys 0m15.910s
$ gcc -O3 cwrite.c -ocwrite # C for writing
$ time ./cwrite
real 0m1.564s
user 0m1.397s
sys 0m0.143s
$ gcc -O3 cread.c -ocread # C for reading
$ time ./cread
real 0m1.353s
user 0m1.240s
sys 0m0.113s

编写的Rust代码:

use std::fs;
use std::io::Write;
fn main() {
let b = b"test";
let mut f = fs::File::create("rs.dump").unwrap();
for _ in 0 .. 100_000_000 {
f.write(b).unwrap();
}
}

用于阅读的 Rust 代码:

use std::{fs, mem};
use std::io::Read;
fn main() {
let mut f = 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();
}
}

编写的C代码:

#include <stdio.h>
#define N 100000000
int main()
{
const char *teststr = "test";
FILE *fp = fopen("c.dump", "wb");
unsigned long long i;
for (i=0; i<N; i++) fwrite(teststr, 4, 1, fp);
fclose(fp);
return 0;
}

用于阅读的 C 代码:

#include <stdio.h>
#define N 100000000

int main() {
FILE *fp = fopen("c.dump", "rb");
long long i;
char buf[4];
for (i=0; i<N; i++) fread(buf, 4, 1, fp);
fclose(fp);
return 0;
}

最佳答案

我的 Rust 程序没有使用缓冲 IO。感谢 BurntSushi5 和 Andrew Henle 的评论,问题解决了。

$ strace ./rswrite
write(3, "test", 4) = 4
write(3, "test", 4) = 4
...
$ strace ./rswrite
read(3, "test", 4) = 4
read(3, "test", 4) = 4
...

我修改了代码:

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();
}
}

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();
}
}

现在,I/O 被缓冲了。

write(3, "testtesttesttesttesttesttesttest"..., 8192) = 8192
write(3, "testtesttesttesttesttesttesttest"..., 8192) = 8192
...

性能和C一样快。

$ time ./rswrite
real 0m1.341s
user 0m0.213s
sys 0m0.200s
$ time ./rsread_buf
real 0m0.596s
user 0m0.540s
sys 0m0.050s

关于performance - 与 C 相比,Rust 文件 I/O 非常慢。有什么问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43028653/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com