【问题标题】:Should I use i32 or i64 on 64bit machine?我应该在 64 位机器上使用 i32 还是 i64?
【发布时间】:2019-01-12 02:35:04
【问题描述】:

ma​​in.rs

#![feature(core_intrinsics)]
fn print_type_of<T>(_: &T) {
    println!("{}", unsafe { std::intrinsics::type_name::<T>() });
}

fn main() {
    let x = 93;
    let y = 93.1;

    print_type_of(&x);
    print_type_of(&y);
}

如果我用“rustc +nightly ./main.rs”编译,我得到这个输出:

$ ./main

i32
f64

我运行 x86_64 Linux 机器。浮点变量默认是双精度的,这很好。 为什么整数只有 4 个字节?我应该使用哪个?如果我不需要 i64,我应该使用 i32 吗? i32 的性能更好吗?

【问题讨论】:

  • 是我遗漏了什么还是你混淆了i64f64
  • @Stargateur:不,他没有。他指出未修饰的浮点文字的默认类型是 64 位类型,因此想知道为什么未修饰的整数文字的默认类型也不是 64 位。
  • 阅读C++ int vs long long in 64 bit machine 会有所帮助。 C++ 增加了可变大小整数的复杂性(在 Rust 中,usizeisize 是唯一具有此属性的类型)。

标签: rust integer


【解决方案1】:

i32 的性能更好吗?

这实际上是一种微妙的事情。如果我们查找一些recent instruction-level benchmarks,例如SkylakeX,则大部分在64位和32位指令之间没有明显的区别。一个例外是除法,64 位除法比 32 位除法慢,即使在除法相同的值时也是如此(除法是少数几个依赖于其输入值的可变时间指令之一)。

对数据使用 i64 也会降低自动矢量化的效率 - 这也是少数情况下小于 32 位的数据在数据大小优化之外的用途之一。当然,数据大小对于 i32 与 i64 的问题也很重要,使用相当大的 i64 数组很容易因为它更大而变慢,因此在缓存中花费更多空间和(如果适用)更多带宽。因此,如果问题是 [i32][i64],那么这很重要。

更微妙的是,使用 64 位操作意味着代码将平均包含更多的 REX 前缀,这使得代码的密度略低,这意味着更少的代码将同时放入 L1 代码缓存。虽然这是一个很小的影响。只需在代码中包含一些 64 位变量不是问题。

尽管如此,绝对不要过度使用 i32,尤其是在你真正应该拥有usize 的地方。例如,不要这样做:

// don't do this
for i in 0i32 .. data.len() as i32 { 
  sum += data[i as usize]; 
}

这会导致性能大幅下降。现在不仅循环中存在无意义的符号扩展,它还破坏了边界检查消除和自动矢量化。但当然,一开始就没有理由编写这样的代码,这比正确编写代码更不自然且更难。

【讨论】:

    【解决方案2】:

    The Rust Programming Language 说:

    [...] 整数类型默认为 i32:这种类型通常是最快的,即使在 64 位系统上也是如此。

    还有(in the next section):

    默认类型是 f64,因为在现代 CPU 上它的速度与 f32 大致相同,但精度更高。


    但是,这是相当简化的。您应该使用哪种整数类型在很大程度上取决于您的程序。最初编写程序时不要考虑速度,除非您已经知道速度将是一个问题。在绝大多数代码中,速度并不重要:即使在性能关键的应用程序中,大多数代码都是冷代码。相比之下,正确性总是很重要

    另请注意,只有 无约束 数值变量默认为 i32/f64。只要您在需要特定数字类型的上下文中使用该变量,编译器就会使用该类型。

    【讨论】:

      【解决方案3】:

      首先,您应该根据自己的需要/要求设计应用程序。即,如果您需要“大”整数,请使用大类型。如果你不需要它们,你应该使用小类型。

      如果您遇到任何性能问题(并且仅在那时),您应该将类​​型调整为您可能不需要的东西。

      【讨论】:

        猜你喜欢
        • 2012-05-26
        • 1970-01-01
        • 2021-11-07
        • 2011-03-08
        • 2010-11-18
        • 2011-06-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多