在计算中使用二的幂有多有利可图

How profitable is it to use powers of two in the calculations?

本文关键字:有利可图 计算      更新时间:2023-10-16

问题是,是否可以通过在乘法和除法中使用2的幂来显著提高生产力,因为编译器可以将它们转换为移位(或者可以显式使用移位(。在我的任务中,我有很多乘以一个数字的次数(我自己输入的系数(,但我可以使用512而不是500。

for(i=0;i<X;i++)
{
cout<<i*512 // or i*500
}

或者我也需要这样做:

for(i=0;i<X;i++)
{
cout<<i>>9;
}

还有一个问题——为条件引入一个变量,这样编译器就不会重复读取条件,还是自动读取?例如:

for(int i=0;i<10*K*H;i++)
{
// K and H cant change in this loop
}

我试图在Compulier Explorer中检查它,但当我除法时,它会创建更少的代码行,而当我乘以时,它不会创建相同的代码

关于for循环中的限制,您可能需要向编译器提供一些帮助。

循环前计算极限:

const int limit = 10 * K * H;
for (i = 0; i < limit; ++i)
{
}

当编译时没有优化(例如调试模式(,这会有所帮助。当您提高优化级别时,编译器可能会执行更好的优化。

我建议打印for循环的汇编语言,并与上面代码的汇编语言进行比较。真相在汇编语言中。

编辑1:移位与乘法
在大多数处理器中,位移位通常比乘法快。在现代处理器中,节省的时间大约是纳秒,或者可能是微秒。

许多编译器会根据优化级别和上下文将乘法转换为位偏移。

在您的示例中,您可能不会注意到优化增益,因为在对cout的调用中会浪费该增益。I/O消耗的时间比通过微优化获得的时间更多。

对代码进行分析将为您提供做出此类决策的最佳数据。另请阅读基准测试以收集更好的数据。例如,您可能需要运行1E6或更多迭代的循环,以排除异常值,如中断和任务交换。