Rust构造使用libsystem_m中的nearint?

时间:2015-12-03 23:47:16

标签: performance floating-point rust

我用Valgrind和Callgrind描述了我的程序,发现大部分时间花在nearbyint$fenv_access_off函数上。

我发现它是一个LLVM内在的,但Rust语言构造使用它?我怎么能避免它?

call map

2 个答案:

答案 0 :(得分:2)

执行search for nearbyint会找到相关的符号nearbyintf32nearbyintf64。这些are documented将最接近的整数返回到浮点值。但是,似乎没有调用该特定功能。

fenv_access_off appears to be an OS X specific aspect of the math library

跟踪中的另一件事是round。我相信round可以使用nearbyint。我也没有在标准库中看到round的任何情况,看起来它们会在紧密循环中出现。

除此之外,任何东西都是纯粹的猜测。

答案 1 :(得分:2)

我用以下内容复制了它:

fn main() {
    let data:Vec<_> = (0..999999).map(|x|{
        (x as f64).powf(2.2).round() as u8
    }).collect();
}

所以似乎as u8是使用nearbyint实现的。

它与C uchar = round(pow(i, 2.2))的速度相同,所以我必须用一个好的查找表替换它......