C++ 在计算中使用二次方有利可图?

C++ 在计算中使用二次方有利可图?,c++,optimization,C++,Optimization,问题是在乘法和除法中使用二次幂是否可以显著提高生产率,因为编译器可以将它们转换为移位(或者可以显式地使用移位)。在我的任务中,我有很多乘法运算(我自己输入的系数),但我可以使用512而不是500 for(i=0;i<X;i++) { cout<<i*512 // or i*500 } for(i=0;i关于for循环中的限制,您可能需要给编译器一些帮助 计算循环前的极限: const int limit = 10 * K * H; for (i = 0; i < l

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

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

for(i=0;i关于
for
循环中的限制,您可能需要给编译器一些帮助

计算循环前的极限:

const int limit = 10 * K * H;
for (i = 0; i < limit; ++i)
{
}
const int limit=10*K*H;
对于(i=0;i
这在不进行优化(例如调试模式)的情况下进行编译时会有所帮助。当您提高优化级别时,编译器可能会执行更好的优化

我建议打印
for
循环的汇编语言,并与上面代码的汇编语言进行比较。事实是汇编语言

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

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

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


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

关于
for
循环中的限制,您可能需要给出c我需要一些帮助

计算循环前的极限:

const int limit = 10 * K * H;
for (i = 0; i < limit; ++i)
{
}
const int limit=10*K*H;
对于(i=0;i
这在不进行优化(例如调试模式)的情况下进行编译时会有所帮助。当您提高优化级别时,编译器可能会执行更好的优化

我建议打印
for
循环的汇编语言,并与上面代码的汇编语言进行比较。事实是汇编语言

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

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

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


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

标准建议适用:使用良好的优化编译器并信任它。编写可理解的代码。在手动优化之前进行配置。请一次问一个问题。对于第二个问题:完全不清楚您在问什么。请为此问另一个问题,并显示两个代码,其中一个代码带有“针对条件的变量,您已引入”一般来说,当问问题时,建议显示代码而不是描述代码。一般来说,这些微优化不会改变任何东西。大多数情况下,编译器生成的机器代码比“聪明”更好和手动优化的C代码。如果您使用的是最新版本的g++或clang with
-O2
优化,那么在优化方面您不可能比编译器做得更好。请关注算法复杂性之类的事情,它们会对性能产生巨大影响。@Sanjeev:不。如果您纠正了移位方向(OP的代码错误右移,将进行除法而不是乘法),。标准建议适用:使用一个好的优化编译器并信任它。编写可理解的代码。在手动优化之前进行配置。请一次问一个问题。对于第二个问题:完全不清楚您在问什么。请为此问另一个问题,并显示两个代码,一个带有“条件变量,你已经介绍了”和t没有。通常在提问时,建议显示代码而不是描述代码。通常这些微优化不会改变任何东西。大多数情况下,编译器生成的机器代码比“聪明”更好“和手工优化的C代码。如果您使用的是最新版本的g++或clang with
-O2
优化,那么在优化方面您不可能比编译器做得更好。请关注算法复杂性之类的事情,它们可能会对性能产生巨大影响。@Sanjeev:不。如果您纠正了移位方向。”(OP的代码错误地右移,将进行除法而不是乘法)。
const int limit = 10 * K * H;
for (i = 0; i < limit; ++i)
{
}