c++ - 何时使用 if 语句选择多个循环而不是单个循环

标签 c++ performance for-loop if-statement

我必须以相同的方式处理数组的每个元素一次,之后还必须通过不可预测的模式修改每个元素。

这些代码片段在性能上是否存在差异?如果存在,为什么?

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/

相关文章:

python - 将已排序的项目搜索到已排序的序列中

for-loop - 在 Clojure 中生成子字符串

linux - 我想将不同的文件夹和其中的文件(所有文件夹都相同)复制到另一个文件夹 - unix

c++ - wxWidgets:使用 wxCSConv wxMBConv 对 wxString 进行编码

C++::使用模板技巧访问多个私有(private)成员

c# - 异步调用一个方法然后等待它,有好处吗?

java - 这个基准比较 Java 8u40 和 8u31 乘以 BigInteger 值是否正确?

C++ 从字符串中取前 8 个符号

C++ : Read/Write Binary data to file when data is complex

c++ - 无序设置为 boost::asio::ip::tcp::endpoint - 试图引用已删除的函数