C++ 考虑到干净代码的性能,什么更好

C++ 考虑到干净代码的性能,什么更好,c++,performance,vector,initialization,range,C++,Performance,Vector,Initialization,Range,对于For循环的清洁度,我喜欢基于范围的For循环。在for循环中,我想填充一个向量,我知道这个向量的大小,但是我缺少一个索引值。我现在有两种方法,声明一个向量并使用push_back添加元素,或者创建一个初始化向量应该更快,因为不需要分配?,计算索引并插入一个元素 问题:一个比另一个有什么性能缺陷和/或有更好的实现吗 在下面的示例代码中,实际代码包含的项目数量相对较少,大概少于10项,但它将在这个过程中运行数百万次 //The vector as input for the for l

对于For循环的清洁度,我喜欢基于范围的For循环。在for循环中,我想填充一个向量,我知道这个向量的大小,但是我缺少一个索引值。我现在有两种方法,声明一个向量并使用push_back添加元素,或者创建一个初始化向量应该更快,因为不需要分配?,计算索引并插入一个元素

问题:一个比另一个有什么性能缺陷和/或有更好的实现吗

在下面的示例代码中,实际代码包含的项目数量相对较少,大概少于10项,但它将在这个过程中运行数百万次

    //The vector as input for the for loop
    std::vector<double> vecIn = { 1, 2, 3, 4, 5 };

    //Adding values to vectors, vector size changes on each loop right?
    std::vector<double> vecOut1;
    //Loop through vector with range looping
    for (auto& val : vecIn) {
        vecOut1.push_back(val); //In reality val is some calculated value based on the input.
    }

    //Adding values to initialized vector, but need to calculate index.
    std::vector<double> vecOut2(vecIn.size());
    //Loop through vector with range looping
    for (auto& val : vecIn) {
        auto i = &val - &vecIn[0];
        vecOut2[i] = val;  //In reality val is some calculated value based on the input.
    }
我喜欢第一圈的短促,但我担心表现会更差

当然,我也可以在循环开始时声明一个索引并对其进行迭代,但这似乎有点违背了清洁的目的


编辑:为了澄清,这是我将一个向量复制到另一个向量的演示代码。在实际程序中,处理输入向量,并根据输入向量计算新值。新值需要插入/追加到向量输出。在实际代码中,输入甚至不是向量,而是boost::ublas::matrix

基本相同

您可以通过以下操作让编译器为您优化:

std::vector<double> vecOut1(vecIn.begin(), vecIn.end());

这实际上取决于您希望如何执行计算,以及计算是否是线性的(如果必须在索引之间跳转或不跳转)。

基本相同

您可以通过以下操作让编译器为您优化:

std::vector<double> vecOut1(vecIn.begin(), vecIn.end());

这实际上取决于您希望如何执行计算,以及计算是否是线性的(如果您必须在索引之间跳转或不跳转)。

第一个循环所需的全部是一个。保留以与第二个循环相同的性能数量级播放:

std::vector<double> vecOut1;
vecOut1.reserve(vecIn.size());
for (auto& val : vecIn) 
    vecOut1.push_back(val); 

在不改变向量大小的情况下预先分配所请求的元素-因此循环中没有重新分配

第一个循环所需的全部是一个.储备,以便在与第二个循环相同的性能数量级上进行:

std::vector<double> vecOut1;
vecOut1.reserve(vecIn.size());
for (auto& val : vecIn) 
    vecOut1.push_back(val); 

在不改变向量大小的情况下预先分配所请求的元素-因此循环中没有重新分配

配置它并查看:使用vector.reserve。如果要复制整个向量,只需执行std::vector vecOut1=vecIn;图书馆会为你做所有的工作。包括预先分配足够的空间。这是示例代码,当然我想做的不仅仅是将一个向量复制到另一个向量中。添加真实示例,而不仅仅是部分对其进行配置并查看:使用vector.reserve。如果要复制整个向量,只需执行std::vector vecOut1=vecIn;图书馆会为你做所有的工作。包括预先分配足够的空间。这是示例代码,当然我想做的不仅仅是将一个向量复制到另一个向量中。添加真实的示例,不仅仅是部分我编辑了我的问题,以便更清楚地说明我不想复制向量,而是提供的代码是示例代码。我编辑了我的答案,但还不清楚你想如何执行你的操作,你的计算有多复杂。我不同意不使用自动。将整个类型的迭代器写入复杂的数据结构非常耗时,不会使代码更具可读性,如果更改底层数据结构,则需要修改它rewritten@EyalK. 你是对的。我并没有说永远停止使用汽车。我认为这篇文章描述了自动的最好和最差之处。我编辑了我的问题,以便更清楚地说明我不想做矢量复制,但提供的代码是示例代码。我编辑了我的答案,但仍然不清楚您希望如何执行操作以及计算有多复杂。我不同意不使用自动。将整个类型的迭代器写入复杂的数据结构非常耗时,不会使代码更具可读性,如果更改底层数据结构,则需要修改它rewritten@EyalK. 你是对的。我并没有说永远停止使用汽车。我认为这篇文章描述了汽车的优点和缺点