发布
社区首页 >问答首页 >为什么向量范围构造器比填充构造函数快10倍?

为什么向量范围构造器比填充构造函数快10倍?
EN

Stack Overflow用户
提问于 2021-04-09 01:58:47
回答 1查看 180关注 0票数 0

我测试了以下两种用100'000元素填充向量的方法:

代码语言:javascript
代码运行次数:0
复制
#include <iostream>
#include <vector>
#include <chrono>

using std::cout;
using std::endl;
using std::vector;
using std::chrono::high_resolution_clock;
using std::chrono::duration_cast;

int main()
{
    const int n = 100'000;

    cout << "Range constructor: " << endl;
    high_resolution_clock::time_point t0 = high_resolution_clock::now();

    int nums10[n];
    for (int i = 0; i < n; ++i) {
        nums10[i] = i;
    }
    vector<int> nums11(nums10, nums10 + n);

    high_resolution_clock::time_point t1 = high_resolution_clock::now();
    cout << "Duration: " << duration_cast<std::chrono::microseconds>(t1 - t0).count() << endl;


    cout << "Fill constructor: " << endl;
    t0 = high_resolution_clock::now();
    
    vector<int> nums1(n);
    for (int i = 0; i < n; ++i) {
        nums1[i] = i;
    }

    t1 = high_resolution_clock::now();
    cout << "Duration: " << duration_cast<std::chrono::microseconds>(t1 - t0).count() << endl;;
}

在我的例子中,范围构造函数运行速度快了近10倍(600微秒对5000微秒)。

为什么这里会有任何性能差异呢?据我所知,有同样数量的外派业务。使用范围构造函数,向数组分配100‘000个元素,然后将所有元素复制到向量中。

这不应该与填充构造函数相同吗?在该构造函数中,首先将100‘000个元素初始化为0,然后在for循环中为所有元素分配“真实”值?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-09 02:45:24

gcc -O0

在第一次测试中:

  • 用来填充数组的循环(程序集的第49-57行)被编译为一个简单的循环,在每次迭代中都有一个存储到内存的存储。它没有得到很好的优化(索引变量保留在堆栈中,而不是在寄存器中,并且重复地来回移动),但至少它是内联代码,不进行任何函数调用。
  • 范围构造函数是对库中预编译构造函数的单个调用(第69行)。我们可以假设库函数是通过积极的优化来编译的;它可能会在手写程序集中调用高度优化的memcpy。所以它大概是最快的。

在第二次测试中:

  • 填充构造函数是一个库调用(第113行)。同样,这大概是尽可能快的速度(可能称为手工优化的memset)。
  • 填充向量的循环(第118-130行)在每次迭代的std::vector<int>::operator[]上生成对的函数调用(第126行)。尽管operator[]本身可能是相当快的,已经预编译了,但每次函数调用的开销,包括重新加载带有参数的寄存器的代码,都是一个杀手。如果您正在使用优化进行编译,那么这个调用可以内联;所有的开销都会消失,而且每次迭代都会有一个内存存储。但你不是在优化,你猜怎么着?性能深为次优。

带优化第二次测试显然更快。这是有意义的,因为它只需要写两次相同的内存块,永远不读;而第一个内存块需要写一个内存块,然后再读取它来写第二个块。

寓意:未优化的代码可能真的很糟糕,如果不尝试这样的优化,那么两段可以优化成非常相似的代码可能会产生很大的不同。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67014099

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档