哪一个更快:给一个变量赋相同的值,还是找出它是否已经被设置
Which is faster: Assigning same value to a variable, or finding out if it is already set?
对于今天的计算能力来说,这可能是无关紧要的,但这仍然是我感兴趣的事情。
我有一个布尔值数组,它在每次主循环的迭代中根据按下的键而改变。这个数组将被用来获取关于键盘输入的信息。
那么:在写入变量之前检查变量是否已经设置为相同的值是否更有效,
void keyDown(unsigned char key){
if(!keys[key])
keys[key] = true;
}
还是更好地将值写入每个KeyDown函数迭代上的相应数组字段?
void keyDown(unsigned char key){
keys[key] = true;
}
谢谢。)
没关系。我们这里讨论的是一个回调函数每次用户点击一个键时它都会执行。这不会每秒发生几百万次。
也就是说,只赋值的无分支版本可能会更快。更重要的是,它的WTF系数为0。我对这个有条件版本的第一反应是"这是什么鬼东西?"
写入变量只需要一条CPU指令。条件语句最多需要比较和跳转(除非编译器对其进行了优化)。在最坏的情况下,用于条件的语句可能需要几个指令来求值。
如果你检查它是否已经设置,你可能不会获得任何东西,因为它必须进行检查(考虑与不进行检查相比的指令数量)。如果你有不止一件事要做如果它被设置了,那么你会从检查中得到一些好处。
当你不检查的时候,不管怎样都要检查,这样会更快,因为指令量更少
我会更关心使用正确的容器,例如,如果做很多push_back调用使用列表而不是vector。这些类型的优化是有意义的,在cpu周期范围内很少调用的函数中的if条件可能不值得花太多时间考虑。
相关文章:
- 是否允许使用带有"w+"模式的 freopen 进行标准设置?
- 是否可以使用智能指针成员设置具有另一个结构的结构?
- 如果我在相应 char 数组的声明中为其提供额外的元素,是否会自动设置 NULL?
- 是否有任何区域设置会影响宽字符编码?
- 由 JOB 中的进程启动的子进程是否可以将 JOB 属性设置为脱离作业?
- 是否可以为boost::random::uniform_int_distribution<>设置确定性种子?
- 是否可以在单独的线程中将 QObject 设置为 QML 上下文属性?
- 如果事件在仍在执行时再次设置,RegisterWaitForSingleObject 是否会并行运行回调?
- 在 c++ 中将对象设置为等于同一类的构造函数是否有效?
- 是否强制转换void**并将第一个字节设置为nullptr
- 是否可以为一个循环设置多个条件
- 检查是否至少设置了一点而不跳跃
- 我是否正确设置了此哈希表?
- 除了 rand() 之外,是否有任何随机生成器库,开发人员可以手动设置种子?
- 如何检查 int 中是否恰好设置了一位?
- 我是否必须在类中的所有变量C++设置为 private?
- 是否可以在C++中使用初始化列表设置数组的特定成员?
- 区域设置是否有定义负号的方面?
- 免疫表中副本的设置是否安全,避免线程损坏
- 使用UTC来回转换日期以忽略DST但仍使用当前用户的有效区域设置是否安全