为什么在Win8-64上使用Rust时,i32的性能比i64好?

为什么在Win8-64上使用Rust时,i32的性能比i64好?,rust,Rust,我最近开始研究锈病。我认为,对于应用程序,我更喜欢使用两种数字类型(i64和f64-通常),因为我认为我的代码可以运行的任何东西都是64位的,我相信每一行代码都很重要,因为简洁性很重要,我不想不断地将数字从i32/int转换为i64,等等 在Win8-64上使用Rust 0.8:(即:Rust 0.8主机:i686-pc-mingw32) 我写了一个小测试程序,看看性能的差异是什么。考虑到结果的时间安排,我想确定为什么会存在差异。根据我看过的文献,Rust将使用处理器用于寻址内存的整数类型。据我

我最近开始研究锈病。我认为,对于应用程序,我更喜欢使用两种数字类型(i64和f64-通常),因为我认为我的代码可以运行的任何东西都是64位的,我相信每一行代码都很重要,因为简洁性很重要,我不想不断地将数字从i32/int转换为i64,等等

在Win8-64上使用Rust 0.8:(即:Rust 0.8主机: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;
}

答案在:rust 0.8主机:i686-pc-mingw32

i686是32位指令集(又称x86),因此您在64位cpu上运行的是32位版本的rust。32位软件不能使用64位整数数学


所以你需要一个64位的rust

谢谢,我查一下。我推测Rust正在编译64位可执行文件。然而,我看到gcc-v表示win32。我记不起确切的安装说明,但我记得安装起来有点乏味,可能主要是因为不熟悉。我认为GCC决定了创建的可执行文件。我不相信Rust现在支持Windows上的64位编译器。谢谢你提供的信息。这或许可以解释为什么现在Windows上绝对可以使用所有的0.64位Rust:)