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