Rust 中表现多样

问题描述 投票:0回答:1

我是 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 行,它包含实际的光线追踪器。

rust benchmarking
1个回答
0
投票

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
,或者为所有矩阵分配一次,在迭代中更新它,然后最后将其写入文件。

© www.soinside.com 2019 - 2024. All rights reserved.