有关std::unordered_set的构造函数的奇怪问题

测试环境:Qt creator, MinGW 32bit Release

想要测试定义一个std::unordered_set需要花费多少时间,于是有如下代码

#include <iostream>
#include <unordered_set>
#include <time.h>

using namespace std;

int main()
{
    const int N = 10000000;
    int num = N;
    clock_t start, finish;
    start = clock();
    while(num-- > 0){
        std::unordered_set<int> set_;
    }
    finish = clock();
    cout << "create " << N <<" std::unordered_set<int> : " << (double)(finish - start) << " ms\n";
    

    return 0;
}

结果发现无论N的值设为多大,都只花费0ms,好像set的构造函数并没有被执行。

 

另外,当我执行两遍while循环进行测试,代码如下

#include <iostream>
#include <unordered_set>
#include <time.h>

using namespace std;

int main()
{
    const int N = 10000000;
    int num = N;
    clock_t start, finish;
    start = clock();
    while(num-- > 0){
        std::unordered_set<int> set_;
    }
    finish = clock();
    cout << "create " << N <<" std::unordered_set<int> : " << (double)(finish - start) << " ms\n";

    start = clock();
    num = N;
    while(num-- > 0){
        std::unordered_set<int> set_;
    }
    finish = clock();
    cout << "create " << N <<" std::unordered_set<int> : " << (double)(finish - start) << " ms\n";
    

    return 0;
}

就出现了奇怪的结果,两次while都花费了100多ms,明明之前测试时无论N值设为多少,第一个while循环只花费0ms。

且花费的时间会随着N增大而变长

现在如果我将某一个while内的set注释掉,则时间又会变成0ms

#include <iostream>
#include <unordered_set>
#include <time.h>

using namespace std;

int main()
{
    const int N = 10000000;
    int num = N;
    clock_t start, finish;
    start = clock();
    while(num-- > 0){
        std::unordered_set<int> set_;
    }
    finish = clock();
    cout << "create " << N <<" std::unordered_set<int> : " << (double)(finish - start) << " ms\n";

    start = clock();
    num = N;
    while(num-- > 0){
        //std::unordered_set<int> set_;
    }
    finish = clock();
    cout << "create " << N <<" std::unordered_set<int> : " << (double)(finish - start) << " ms\n";
    

    return 0;
}

 

这不是很奇怪嘛,unordered_set的定义所花费的时间与外部循环次数没有关系,而是与在同一代码段有没有再次定义有关,而且只有unordered_set才会有这个现象list vector set都没有这种情况,请问这是为什么??

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 以帮助更多的人 ^-^