为什么Rust比这么好

时间:2016-05-29 08:04:33

标签: c rust

多年来,我使用这个非常简单的程序来粗略估计编程语言的性能。我有十几个版本的Ruby(600毫秒),Python(1500毫秒),JavaScript(45毫秒),C(25毫秒GCC / Clang在我的笔记本上)和其他语言。不要基于这样一个简单的基准做出认真的结论,因为它远非任何现实生活中的情况。我称之为"经典"仅仅因为我已经使用了几十年了。甚至可能会说"粗略估计"太过分了。这个测试非常简单,主要是因为为你不熟悉的语言编写更好的测试是非常耗时的,而且我通常在第一次使用新语言时编写它。但有时候,几年后我会在编译器/解释器获得更新时运行测试。无论如何,最近我将这个测试移植到(for?)Rust并且真的很惊讶因为它比以前的记录持有者C大约三倍(7毫秒!〜@!)。我的问题是那些了解Rust编译的人,为什么这么快?我知道它使用LLVM就像Clang所以我期望大约相同的速度(就像Nim执行C一样,因为它编译为C,虽然不是很有效,并且在运行这个简单的基准测试时仍然比C慢两倍)。

// rustc --color always -C opt-level=3 -C prefer-dynamic classic.rs  -C link-args=-s -o classic.rust

use std::ptr;

#[repr(C)]
struct timeval {
    tv_sec: i64,
    tv_usec: i64
}

extern {
    fn gettimeofday(tv: &mut timeval, tzp: *const ()) -> i32;
}

fn time1000() -> i64 {
    let mut tv = timeval { tv_sec: 0, tv_usec: 0 };
    unsafe {
        gettimeofday(&mut tv, ptr::null());
    }
    tv.tv_sec * 1000 + tv.tv_usec / 1000
}

fn classic() {
    let mut a:i64 = 3000000;
    loop {
        a = a - 1;
        if a == 0 { break; }
        let mut b = (a / 100000) as i64;
        b = b * 100000;
        if a == b { print!("{} ", a); }
    }
}

fn main() {
    let mut t = time1000();
    classic();
    t = time1000() - t;
    println!("{}", t);
}

C

#include "stdio.h"
#include <sys/time.h>

long time1000() {
    struct timeval val;
    gettimeofday(&val, 0);
    return val.tv_sec * 1000 + val.tv_usec / 1000;
}

void classic() {
    double a = 3000000, b;
    while (1) {
        a--;
        if (a == 0) break;
        b = a / 100000;
        b = (int) b;
        b *= 100000;
        if (a == b) { printf("%i ", (int)a); }
    }
}

int main() {
    int T = time1000();
    classic();
    T = time1000() - T;
    printf("%i", (int)T);
}

1 个答案:

答案 0 :(得分:4)

替代

int64_t a = 3000000, b;

double a = 3000000, b;

使用

使其等效(在64位拱门上)
   let mut a:i64 = 3000000;
   //...
   let mut b = (a / 100000) as i64;

和C获胜(即使使用stdio)。 在我的PC上,C的速度提高了大约1.4-1.5倍(-O3,在100次迭代的shell上测量,用于循环以降低启动开销)。