std :: set быстро и медленно, что происходит?

Я обнаружил странное поведение std :: set.

Вот код:

#include <cstdio>
#include <windows.h>
#include <stdlib.h>

#include <vector>
#include <set>

using namespace std;

int main(int argc, char *argv[])
{
    set<int> b[100];

    for (int o=0; o<10; o++)
    {
        int tt = GetTickCount();

        for (int i=0; i<5000000; i++)
        {
            b[o].insert(i);
        }

        tt = GetTickCount() - tt;

        b[o].clear();

        printf("%d\n", tt);
    }

    return 0;
}

Я работаю в Windows XP.

Вот интересная часть: время первой печати составляет около 3500 мс, а все последующие - более 9000 мс! Почему это происходит?

О, и это только случается. по релизной версии (оптимизация -O2).

Этого не происходит в Linux (после изменения кода для компиляции).

И еще одно: когда я запускаю его во время профилирования с помощью Intel VTune, он всегда занимает около 3000 мс, так что так и должно быть.

ОБНОВЛЕНИЕ: Вот новый код:

#include <cstdio>
#include <windows.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
const int count = 10000000;
int **a = new int*[count];

for (int o=0; o<10; o++)
{
    int ttt = GetTickCount();

    for (int i=0; i<count; i++)
    {
        a[i] = new int;

        *a[i] = i;
    }

    int ttt2 = GetTickCount();

    for (int i=0; i<count; i++)
    {
        int r1 = rand() * 10000 + rand();
        int r2 = rand() * 10000 + rand();
        r1 = r1%count;
        r2 = r2%count;

        int *e = a[r1];
        a[r1] = a[r2];
        a[r2] = e;
    }

    int ttt3 = GetTickCount();

    for (int i=0; i<count; i++)
    {
        delete a[i];
    }

    int ttt4 = GetTickCount();

    printf("%d %d\n", ttt2-ttt, ttt4-ttt3);
}

return 0;
}

Это та же проблема. Происходит то, что я выделяю много маленьких объектов, а затем удаляю их в случайном порядке - так что это похоже на то, как это выглядит в std :: set. Итак, это проблема управления памятью Windows. Он не может хорошо справляться со многими небольшими выделениями и удалениями.

9
задан detunized 17 November 2011 в 16:15
поделиться