2014-10-09 19 views
9

Tôi muốn tìm hiểu một chút về tác vụ gỉ, vì vậy tôi đã thực hiện tính toán carlo monte của PI. Bây giờ câu đố của tôi là lý do tại sao phiên bản C đơn luồng nhanh hơn 4 lần so với phiên bản Rust 4 trục. Rõ ràng tôi đang làm điều gì đó sai, hoặc mô hình hoạt động tâm thần của tôi là cách tắt.hiệu suất rỉ sét so với c

Dưới đây là phiên bản 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); 
} 

Phiên bản Rust không phải là một cổng line-by-line:

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

xây dựng và thời gian phiên bản 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 

Xây dựng và thời gian phiên bản 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 
+0

Trình hồ sơ nói gì? (ví dụ: một bài học hay để tìm hiểu các điểm nóng và tắc nghẽn trong mã của bạn). – Necrolis

+2

Không biên dịch với các biểu tượng gỡ lỗi trên. – AndyG

+11

'phiên bản C đơn luồng có tốc độ chậm hơn 4 lần so với phiên bản Rust 4 phiên bản luồng. Những con số bạn đăng có vẻ là một cách khác xung quanh –

Trả lời

9

Nút cổ chai, như Dogbert đã quan sát, là trình tạo số ngẫu nhiên. Dưới đây là một cách nhanh chóng và được gieo giống theo từng chủ đề

fn monte_carlo_pi(id: u32, nparts: uint) -> uint { 
    ... 
    let mut rng: XorShiftRng = SeedableRng::from_seed([id,id,id,id]); 
    ... 
} 
Các vấn đề liên quan