多年来,我使用这个非常简单的程序来粗略估计编程语言的性能。我有十几个版本的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);
}
答案 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上测量,用于循环以降低启动开销)。