非两个功率数的快速分区和模块化操作

时间:2014-12-30 16:33:48

标签: c

我正在尝试优化分区和模块化操作,以提高C语言中代码的整体性能。

我有

UINT32 quo = num / 520 ;
UINT32 rem = num % 520 ;

大多数博客都提到了优化2个操作的强大功能,比如

num % (2^i) = num & (2^i -1 ).

我的代码中的num将是一个相当大的数字。

请为上述代码建议替代方法。

2 个答案:

答案 0 :(得分:1)

正如Oliver在评论中已经提到的,编译器应该自动优化除法和模运算。但是,如果您想了解更多关于常数除数除法的优化(比如示例中的520),您可能会发现此链接http://ridiculousfish.com/blog/posts/labor-of-division-episode-iii.html很有帮助。

诀窍是找到一个合适的因子,以便可以用乘法 - 位移操作代替除法运算。

答案 1 :(得分:1)

其他人评论说,编译器会通过常量优化除法 - 有效地执行乘法,在编译时计算逆。硬件整数除法总是慢于乘法,这些指令的相对延迟差距继续扩大。

GCC中不变整数除法的强大实现首先按照this论文中的描述实现。更多recent论文改进了这些结果。