轮班操作员快还是不快
Shift operator fast or not fast?
本文关键字:操作员 更新时间:2023-10-16
以下两个代码中速度更快的是什么?为什么?在哪种情况下,一个可以优先于另一个?
double x = (a + b) >> 1
double x = (a + b) / 2.0
它们做不同的事情,所以选择一个具有您喜欢的功能的:向下截断结果或返回0.5分数。
"过早优化是万恶之源"。当您遇到性能问题时,请使用可读性更强的方法,首先查找算法和数据结构,在那里您可以获得最大的性能增益,然后运行探查器并在必要时进行优化。
正如其他人所说,这两个语句会产生不同的结果,尤其是当(a + b)
是奇数时。
此外,根据该语言,a
和b
必须是整数值才能满足移位操作。
如果a
和b
在两个语句之间的类型不同,那么您将把苹果比作大象。
给定这个演示程序:
#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
。这种划分是浮点的,在没有硬件浮点支持的平台上可能会很慢。
您不应该关心这两个语句的执行速度。更重要的是程序的正确性和稳健性。例如,上面的两个语句提供了不同的结果,这是一个非常重要的正确性问题。
大多数用户会等待程序产生正确的结果,而不是让一个快速程序产生不正确的结果或行为(没有人急于让程序崩溃)。
管理层宁愿你花时间完成程序,也不愿浪费时间优化程序中不经常执行的部分。
如果a
或b
是双精度或浮点值,移位将产生不正确的结果。
相关文章:
- <<操作员在下面的行中工作
- C++ 与操作员不匹配<<
- 操作员C++的模棱两可的过载
- C++中>>操作员过载时出现问题?
- NaN 上的宇宙飞船操作员
- 比根<操作员
- SFINAE不能防止模棱两可的操作员过载吗?
- 什么是现实中的"endl"(或任何输出操纵器)?它是如何实现的,它如何与操作员<<一起工
- 为什么"delete"操作员给我访问权限冲突
- 为什么使操作员成为新的专用会打破 std::shared_ptr?
- 在这种情况下是私有的吗?试图使操作员<<过载
- C++操作员过载>>
- 是否有 C++20 浮点数的包装器,使我能够默认宇宙飞船操作员?
- 与异常处理程序中的操作员<<不匹配
- 复印作业操作员说明
- 友谊和操作员+=重载
- >操作员在比较两个C++容器时会怎么做?
- 与操作员比较两个计时时间点
- C++操作员订单评估
- 如何强制新操作员根据我的需要解释语句