我是 Rust 新手,但以下内容让我非常困惑。我用几种语言(C、C++、go、python、rust)编写了一个小型光线追踪器来比较一些基准。我承认这是我的第一个 Rust 程序,但令我非常惊喜的是,Rust 在性能上超越了 Go 和 C++,落后于 Python(Pypy)和 C(gcc 和 clang)。
第一次(Rust)运行大约需要 19 秒。我想得到一个好的平均值,所以我重新运行了程序,结果这次只花了 85 秒!第二差的时间(CPython 花了 5000 多秒......)。我再次重新跑,得到了 55 秒,然后再次重新跑,得到了 20 秒。
作为比较,C、C++、go 和 Python 都给出了非常一致的时间。 编译器不会给出错误或警告。生成的图像也与其他语言生成的图像相同。 到底是怎么回事?!?
这是存储库: https://github.com/ryanmaguire/newtonian_black_holes/
编译:
rustc -C opt-level=3 -C lto=true nbh.rs
rustc -C opt-level=3 -C lto=true --extern nbh=libnbh.rlib main.rs
time ./main
最近一次运行给出:
real 0m53.728s
user 0m51.527s
sys 0m2.196s
之前的结果:
real 0m21.642s
user 0m19.296s
sys 0m2.344s
编辑:
main.rs
的内容很小:
extern crate nbh;
fn main() {
nbh::raytrace::run(nbh::setup::gravity,
nbh::setup::stop,
nbh::color::checker_board,
nbh::euler::path,
"newtonian_black_hole.ppm");
}
nbh.rs
大约有 1000 行,它包含实际的光线追踪器。
在
raytrace::run()
你有
for y in 0..=setup::YSIZE-1 {
for x in 0..=setup::XSIZE-1 {
// ...
c.write(&out.file);
}
用
out.file
这样创建
let file_result = fs::File::create(path);
A
std::fs::File
未缓冲(大致是文件描述符),然后您对每个像素执行系统调用。
这可以解释巨大的变异性。
BufWriter
,或者为所有矩阵分配一次,在迭代中更新它,然后最后将其写入文件。