为什么Rust比C好得多

  • 本文关键字:好得多 Rust c rust
  • 更新时间 :
  • 英文 :


多年来,我一直使用这个非常简单的程序来粗略估计编程语言的性能。我有十几个Ruby(600毫秒)、Python(1500毫秒)、JavaScript(45毫秒)、C(25毫秒,在我的笔记本上都是GCC/Clang)和其他语言的版本。不要基于这样一个简单的基准做出严肃的结论,因为它与任何现实生活中的案例都相去甚远。我之所以称之为"经典",仅仅是因为我已经用了几十年了。也许说"粗略估计"也太过分了。这个测试非常简单,主要是因为为一种你不知道的语言写更好的测试很耗时,而且我通常是在第一次掌握新语言时写的。不过,有时我会在几年后编译器/解释器得到更新时运行测试。不管怎么说,最近我把这个测试移植到了(for?)Rust,真的很惊讶,因为它的表现比之前的记录保持者C高出了大约三倍(7毫秒!~@!)。我的问题是,对于那些了解Rust编译的人来说,为什么它这么快?我知道它和Clang一样使用LLVM,所以我预计它的速度大致相同(就像Nim一样,因为它编译到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);
}

替换

int64_t a = 3000000, b;

对于

double a = 3000000, b;

使其与等效(在64位拱门上)

let mut a:i64 = 3000000;
//...
let mut b = (a / 100000) as i64;

C获胜(即使使用stdio)。在我的电脑上,C的速度大约快1.4–1.5倍(-O3,在循环的100次迭代外壳上测量,以减少启动开销)。

最新更新