我最近开始关注Rust。我认为对于应用程序,我宁愿只使用两种数字类型(通常是i64和f64),因为我认为我的代码可以运行的任何东西都是64位的,我相信每一行代码都很重要,因为简洁很重要,我不想不断地从例如转换数字。 i32 / int到i64等。
在Win8-64上使用Rust 0.8:(IE:rust 0.8 host:i686-pc-mingw32)。
我写了一个小测试程序,看看性能差异是什么。鉴于产生的时间安排,我想确定为什么存在差异。根据我查看的文献,Rust将使用处理器使用的整数类型来寻址内存。据我所知,在64位处理器(Intel Core-i5)上,即64位。然而,看起来Rust上的“int”使用的是32位,而且32位看起来比64位更快。虽然我认为性能的差异(考虑到测试中的迭代次数)对于应用程序而言相对微不足道,但它仍然提出了所指出的问题。 IE:32位int用于64位处理器,为什么64位机器上的32位更快?
我的测试程序的结果如下。所示的时间在许多重复上都是一致的:
1000000000 iters (i64 iters and i64 simple addition) .....
Total Elapsed time = 3237.86 ms
Result from i64 addition = 2000000000
1000000000 iters (int iters and int simple addition) .....
Total Elapsed time = 2353.45 ms
Result from int addition = 2000000000
1000000000 iters (i32 iters and i32 simple addition) .....
Total Elapsed time = 2375.52 ms
Result from i32 addition = 2000000000
使用的代码如下:
fn fTesti64Add(mut iIterMax:i64) -> i64 {
println(fmt!("\n%s iters (i64 iters and i64 simple addition) .....",
iIterMax.to_str()));
let uTmeStart:u64 = extra::time::precise_time_ns();
let mut iTot:i64 = 0;
while iIterMax>0 {
iTot += 2;
iIterMax -=1;
}
fDisplayElapsed(uTmeStart, extra::time::precise_time_ns());
return iTot;
}
fn fTestIntAdd (mut iIterMax:int) -> int {
println(fmt!("\n%d iters (int iters and int simple addition) .....", iIterMax));
let uTmeStart:u64 = extra::time::precise_time_ns();
let mut iVal:int = 0;
while iIterMax > 0 {
iVal += 2;
iIterMax -= 1;
}
fDisplayElapsed(uTmeStart, extra::time::precise_time_ns());
return iVal;
}
fn fTestI32Add (mut iIterMax:i32) -> i32 {
println(fmt!("\n%s iters (i32 iters and i32 simple addition) .....",
iIterMax.to_str()));
let uTmeStart:u64 = extra::time::precise_time_ns();
let mut iVal:i32 = 0;
while iIterMax > 0 {
iVal += 2;
iIterMax -= 1;
}
fDisplayElapsed(uTmeStart, extra::time::precise_time_ns());
return iVal;
}
答案 0 :(得分:12)
答案是:rust 0.8 host:i686-pc-mingw32
i686是32位指令集(Aka x86),所以你在64位cpu上运行32位版本的rust。并且32位软件不能使用64位整数数学。
所以你需要64位生锈。