Я обнаружил странное поведение 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. Он не может хорошо справляться со многими небольшими выделениями и удалениями.