这是在 Compiler Explorer 上进行实验的结果,以确定编译器(rustc)在涉及log2()/leading_zeros()和类似函数时的行为。我发现这个结果似乎既奇怪又令人担忧:
代码:
pub fn lzcnt0(val: u64) -> u64 {
val.leading_zeros() as u64
}
pub unsafe fn lzcnt1(val: u64) -> u64 {
core::arch::x86_64::_lzcnt_u64(val)
}
pub unsafe fn lzcnt2(val: u64) -> u64 {
asm_lzcnt(val)
}
#[inline]
pub unsafe fn asm_lzcnt(val: u64) -> u64 {
let lzcnt: u64;
core::arch::asm!("lzcnt {}, {}", in(reg) val, lateout(reg) lzcnt, options(nomem, nostack));
lzcnt
}
Run Code Online (Sandbox Code Playgroud)
输出:
example::lzcnt0:
test rdi, rdi
je .LBB0_2
bsr rax, rdi
xor rax, 63
ret
.LBB0_2: …Run Code Online (Sandbox Code Playgroud) 当我想知道哪个更快时,我正在创建和翻译一些算法。
A)(int)float
或者
b)Mathf.FloorToInt(float)
提前致谢。
编辑:如果有比这两种方法更快的方法,那也会有帮助。