在计算中使用二的幂有多有利可图
How profitable is it to use powers of two in the calculations?
问题是,是否可以通过在乘法和除法中使用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或更多迭代的循环,以排除异常值,如中断和任务交换。
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 递归函数计算序列中的平方和(并输出过程)
- (C++)分析树以计算返回错误值的简单算术表达式
- 我的字符计数代码计算错误.为什么
- 在计算中使用二的幂有多有利可图
- 如何计算文件中的"columns"数?
- 计算排序向量的向量中唯一值的计数
- 如何使用 std::累积在 C++ 中计算总和立方体
- 使用Qt C++计算类似Git的SHA1哈希
- OpenCV C++.快速计算混淆矩阵
- cpp二进制搜索问题,计算给定数组中输入元素的出现次数
- C++如何计算用户输入的数字中的偶数位数
- 如何计算数据类型的范围,例如int
- 类似枚举的计算常量
- 计算每个节点的树高,帮助我解释这个代码解决方案
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 计算缩放多边形的比例,得到给定的多边形面积
- 在C++中如何在没有pow的情况下进行基础计算
- 计算平均值,不包括上次得分
- 如何计算多映射中重复对的数量