Shift操作员快速还是不快?

时间:2014-01-15 18:07:45

标签: c++ bit-shift

以下两个代码之间的速度有多快?为什么? 在哪种情况下,一个可以优先于另一个?

double x = (a + b) >> 1
double x = (a + b) / 2.0

4 个答案:

答案 0 :(得分:6)

这些做了不同的事情,所以选择一个具有你喜欢的功能:截断结果或返回0.5分数。

答案 1 :(得分:3)

"过早优化是万恶之源"。使用更具可读性的内容,当您首次查找算法和数据结构时,可以获得最佳性能增益,然后运行分析器并优化必要的位置。

答案 2 :(得分:0)

如果ab是double或float,则移位会产生错误的结果。

答案 3 :(得分:0)

正如其他人所说,这两个陈述产生不同的结果,特别是如果(a + b)是一个奇数值。

此外,根据语言,ab必须是整数值才能满足转换操作。

如果两个语句之间的ab类型不同,则您将苹果与大象进行比较。

鉴于此演示程序:

#include <iostream>
#include <cstdlib>
#include <cmath>

using std::cout;
using std::endl;

int main(void)
{
    const unsigned int a = 5;
    const unsigned int b = 8;

    double x = (a + b) >> 1;
    cout << x << endl;
    double y = (a + b) / 2.0;
    cout << y << endl;

    return EXIT_SUCCESS;
}

输出:
6
6.5

根据这个实验,比较是苹果到橙子。涉及移位的语句是一个不同的操作,除以浮点数。

就速度而言,第二个语句较慢,因为在应用除法之前必须将表达式(a + b)转换为double。除法是浮点,在没有硬件浮点支持的平台上可能很慢。

您不应该关注任何一个语句的执行速度。更重要的是该计划的正确性和稳健性。例如,上面的两个陈述提供了不同的结果,这是正确性的一个非常重要的问题。

大多数用户会等待程序产生正确的结果而不是快速程序产生不正确的结果或行为(没有人急于让程序崩溃)。

管理层宁愿花时间完成程序而不是浪费时间来优化不经常执行的程序部分。