gpt4 book ai didi

c - Rust 与 C 性能

转载 作者:太空狗 更新时间:2023-10-29 16:34:10 26 4
gpt4 key购买 nike

我想学习一些关于 Rust 任务的知识,所以我做了一个蒙特卡洛计算圆周率。现在我的困惑是为什么单线程 C 版本快 4 倍比 4 路线程 Rust 版本。很明显我做错了什么,或者我的心智表现模式有偏差。

这是 C 版本:

#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>

#define PI 3.1415926535897932

double monte_carlo_pi(int nparts)
{
int i, in=0;
double x, y;
srand(getpid());

for (i=0; i<nparts; i++) {
x = (double)rand()/(double)RAND_MAX;
y = (double)rand()/(double)RAND_MAX;

if (x*x + y*y < 1.0) {
in++;
}
}

return in/(double)nparts * 4.0;
}

int main(int argc, char **argv)
{
int nparts;
double mc_pi;

nparts = atoi(argv[1]);
mc_pi = monte_carlo_pi(nparts);
printf("computed: %f error: %f\n", mc_pi, mc_pi - PI);
}

Rust 版本不是逐行移植:

use std::rand;
use std::rand::distributions::{IndependentSample,Range};

fn monte_carlo_pi(nparts: uint ) -> uint {
let between = Range::new(0f64,1f64);
let mut rng = rand::task_rng();
let mut in_circle = 0u;
for _ in range(0u, nparts) {
let a = between.ind_sample(&mut rng);
let b = between.ind_sample(&mut rng);

if a*a + b*b <= 1.0 {
in_circle += 1;
}
}
in_circle
}

fn main() {
let (tx, rx) = channel();

let ntasks = 4u;
let nparts = 100000000u; /* I haven't learned how to parse cmnd line args yet!*/
for _ in range(0u, ntasks) {
let child_tx = tx.clone();
spawn(proc() {
child_tx.send(monte_carlo_pi(nparts/ntasks));
});
}

let result = rx.recv() + rx.recv() + rx.recv() + rx.recv();

println!("pi is {}", (result as f64)/(nparts as f64)*4.0);
}

构建并计时 C 版本:

$ clang -O2 mc-pi.c -o mc-pi-c; time ./mc-pi-c 100000000
computed: 3.141700 error: 0.000108
./mc-pi-c 100000000 1.68s user 0.00s system 99% cpu 1.683 total

构建并计时 Rust 版本:

$ rustc -v      
rustc 0.12.0-nightly (740905042 2014-09-29 23:52:21 +0000)
$ rustc --opt-level 2 --debuginfo 0 mc-pi.rs -o mc-pi-rust; time ./mc-pi-rust
pi is 3.141327
./mc-pi-rust 2.40s user 24.56s system 352% cpu 7.654 tota

最佳答案

正如 Dogbert 观察到的那样,瓶颈在于随机数生成器。这是一个快速的并且在每个线程上播种不同的

fn monte_carlo_pi(id: u32, nparts: uint ) -> uint {
...
let mut rng: XorShiftRng = SeedableRng::from_seed([id,id,id,id]);
...
}

关于c - Rust 与 C 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26280533/

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