在Rust中编写整数函数时(例如像素处理),使用性能最高的操作很有用,类似于C/C++。虽然参考手册解释了行为的更改,但并不总是清楚哪些方法比标准整数算术运算更高效。(请参见注1)我认为wrapping_add编译后等同于C语言的加法。在标准操作(加/减/乘/取模/除/移位/位操作...)中,哪些操作有更高效的替代方法,而默认情况下没有使用?
注: 1.通过“标准”,我指的是使用符号a+b、i/k或c%e等的整数算术。编写数学表达式时会使用它们,除非您有特殊需要使用其中一种包装或返回溢出的方法。 2.我意识到回答这个问题可能需要一些研究。所以我很乐意通过查看生成的汇编来检查使用未检查/原始操作的哪些操作。 3.如果检查/未检查操作之间的速度差异不显着,那么我仍然希望能够编写一个“快速”版本的函数与“安全”版本进行比较,以得出自己对于给定函数是否合理的结论。 4.提到像素处理后,SIMD被提出作为一种可能的解决方案。即使这是个好建议,仍然有一些情况无法使用SIMD进行优化,因此仍需考虑快速整数算术的一般情况。
注: 1.通过“标准”,我指的是使用符号a+b、i/k或c%e等的整数算术。编写数学表达式时会使用它们,除非您有特殊需要使用其中一种包装或返回溢出的方法。 2.我意识到回答这个问题可能需要一些研究。所以我很乐意通过查看生成的汇编来检查使用未检查/原始操作的哪些操作。 3.如果检查/未检查操作之间的速度差异不显着,那么我仍然希望能够编写一个“快速”版本的函数与“安全”版本进行比较,以得出自己对于给定函数是否合理的结论。 4.提到像素处理后,SIMD被提出作为一种可能的解决方案。即使这是个好建议,仍然有一些情况无法使用SIMD进行优化,因此仍需考虑快速整数算术的一般情况。
wrapping_add
,因为 rustc 在 Release 模式下不会检查下溢/上溢,除非你明确要求检查。 - Matthieu M.