在Rust

时间:2016-07-30 12:01:56

标签: performance rust integer-arithmetic

我正在Rust中编写一个有效的平方方法。我们假设Mul的{​​{1}}特征是一个黑盒子,我们只允许安全,惯用的Rust。

下面是第一遍,它使用重复平方来获得更大的指数。我不确定LLVM将如何转换Rust算术方法调用,例如AbstractNumber

以下内容是否合理?将小案例分支拆分为自己的内联函数会更有效吗?

checked_next_power_of_two()

1 个答案:

答案 0 :(得分:3)

为什么不使用num::pow::pow?无论如何,这是如何实现的:

#[inline]
pub fn pow<T: Clone + One + Mul<T, Output = T>>(mut base: T, mut exp: usize) -> T {
    if exp == 0 { return T::one() }

    while exp & 1 == 0 {
        base = base.clone() * base;
        exp >>= 1;
    }
    if exp == 1 { return base }

    let mut acc = base.clone();
    while exp > 1 {
        exp >>= 1;
        base = base.clone() * base;
        if exp & 1 == 1 {
            acc = acc * base.clone();
        }
    }
    acc
}

除了Clone(和Mul之外,它还需要One,但如果您不是通用的,则不需要{。}}。

顺便说一句,在Rust中使用按位运算没有任何错误或不安全。