我用Valgrind和Callgrind描述了我的程序,发现大部分时间花在nearbyint$fenv_access_off
函数上。
我发现它是一个LLVM内在的,但Rust语言构造使用它?我怎么能避免它?
答案 0 :(得分:2)
执行search for nearbyint
会找到相关的符号nearbyintf32
和nearbyintf64
。这些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))
的速度相同,所以我必须用一个好的查找表替换它......