为什么这些结果表明不需要在向量中使用保留?

Bba*_*one -3 c++ performance stdvector c++11

我编写了以下代码,以测量1000k不使用保留和保留的情况下推回整数时间所花费的时间。结果不是我想要的。

所有测试均在我的Samsung ativtap7上执行,该处理器具有在Windows 10下运行的核心i5 @ 1.8 Ghz处理器,4 GB RAM和VS2018 C ++编译器。

#include <iostream>
#include <vector>
#include "Stopwatch.h"
using namespace std;

int main()
{
    Stopwatch myWatch;
    //pushback 1000k times without reserve
    for (int i = 0; i < 10; i++)
    {
        cout << "try " << i + 1 << endl;
        myWatch.Start();
        vector<int> vec1;
        for (int i = 0; i < 1000000; i++)
        {
            vec1.push_back(i);
        }
        myWatch.End();
        myWatch.LookElapsedTime();

        //pushback 1000k times with reserve
        myWatch.Start();
        vector<int> vec2(1000000);
        for (int i = 0; i < 1000000; i++)
        {
            vec2.push_back(i);
        }

        myWatch.End();
        myWatch.LookElapsedTime();
        cout << endl;
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我期望结果显示出使用储备金和不使用储备金之间的有意义的区别,但是实际结果与我的预期不符。

以下是结果。

try 1
1.51118(sec)
1.46981(sec)

try 2 
1.43074(sec)
1.4381(sec)

try 3
1.4428(sec)
1.46196(sec)

try 4
1.41903(sec)
1.43688(sec)

try 5
1.47544(sec)
1.558(sec)

try 6
1.47474(sec)
1.45484(sec)

try 7
1.47731(sec)
1.5908(sec)

try 8
1.77192(sec)
1.72018(sec)

try 9
1.56832(sec)
1.447(sec)

try 10
1.43659(sec)
1.43572(sec)
Run Code Online (Sandbox Code Playgroud)

我想知道为什么会这样。

JeJ*_*eJo 14

您根本没有保留内存。在第二个向量中

vector<int> vec2(1000000);
Run Code Online (Sandbox Code Playgroud)

这意味着使用分配和初始化1000000整数0。您需要

vector<int> vec2;
vec2.reserve(1000000);
Run Code Online (Sandbox Code Playgroud)

查看使用quick-bench.com完成的基准测试。现在很清楚,保留很重要

见在线

在此处输入图片说明