轮班操作员快还是不快

Shift operator fast or not fast?

本文关键字:操作员      更新时间:2023-10-16

以下两个代码中速度更快的是什么?为什么?在哪种情况下,一个可以优先于另一个?

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

它们做不同的事情,所以选择一个具有您喜欢的功能的:向下截断结果或返回0.5分数。

"过早优化是万恶之源"。当您遇到性能问题时,请使用可读性更强的方法,首先查找算法和数据结构,在那里您可以获得最大的性能增益,然后运行探查器并在必要时进行优化。

正如其他人所说,这两个语句会产生不同的结果,尤其是当(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。这种划分是浮点的,在没有硬件浮点支持的平台上可能会很慢。

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

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

管理层宁愿你花时间完成程序,也不愿浪费时间优化程序中不经常执行的部分。

如果ab是双精度或浮点值,移位将产生不正确的结果。