我必须以相同的方式处理数组的每个元素一次,之后还必须通过不可预测的模式修改每个元素。
这些代码片段在性能上是否存在差异?如果存在,为什么?
std::vector<int> nums;
//fill nums array
for(unsigned int i = 0; i < nums.size(); ++i){
nums[i] *= nums[i];
if(nums[i] < 10){
nums[i] = 0;
}
}
std::vector<int> nums;
//fill nums array
for(unsigned int i = 0; i < nums.size(); ++i){
nums[i] *= nums[i];
}
for(unsigned int i = 0; i < nums.size(); ++i){
if(nums[i] < 10){
nums[i] = 0;
}
}
像这样的不同方法会有所改善吗?
std::vector<int> nums;
//fill nums array
std::vector<int> flags;
flags.resize(nums.size());
for(unsigned int i = 0; i < nums.size(); ++i){
nums[i] *= nums[i];
flags[i] = nums[i] < 10;
}
for(unsigned int i = 0; i < flags.size(); ++i){
nums[i] = (!flags[i]) * nums[i]; //!flags[i] is 0 if nums[i] < 10
}
最佳答案
第一个语句较少(这始终是一个很好的粗略指南:较少的相似语句通常意味着更好的性能),但最重要的是,它的可读性要高得多。
不要微优化:将其留给编译器。
如果您有任何疑问,请检查生成的程序集/分析性能。
最后(道歉,因为我无法抗拒),如果 nums
是一个std::vector<unsigned>
,那么你可以写
for (std::size_t i = 0; i < nums.size(); ++i){
nums[i] *= (nums[i] <= 3 ? 0 : nums[i]);
}
哪些可以帮助分支预测器。
关于c++ - 何时使用 if 语句选择多个循环而不是单个循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44973165/