MS Windows Vista
MS Visual Studio 2008 Express Edition
Проект:
#include <deque>
#include <list>
#include <string>
#include <queue>
#include "stdio.h"
#include "conio.h"
#include "windows.h"
using namespace std;
struct Message
{
Message(const string& a, const string& b): A(a), B(b){}
string A,B;
};
int main(int argc, char* argv[])
{
int STRING_SIZE = 1000;
int TOTAL = 1000000;
int N = 1000;
if (argc > 1) N = atoi(argv[1]);
if (argc > 2) STRING_SIZE = atoi(argv[2]);
queue<Message*> z;
int k = 1;
printf("Portion size: %d, string size: %d, press ENTER to start\n", N, STRING_SIZE); getch();
string A(STRING_SIZE , '0');
string B(STRING_SIZE + STRING_SIZE , '1');
unsigned t = GetTickCount();
while (TOTAL > 0)
{
for (int i = 0; i < N; i++)
z.push(new Message(A,B));
while (!z.empty())
{
delete z.front();
z.pop();
}
printf("%d ", k);
k++;
TOTAL -= N;
}
printf(" done in %d ms", GetTickCount() - t); getch();
}
Идея очень проста — необходимо прокачать через очередь (STL queue) один миллион (TOTAL) неких сообщений (Message).
В queue мы храним только указатель (Message*). Новые объекты Message создаются и заносятся в очередь порциями.
Размер порции: N. То бишь заносим N новых сообщений, полностью выбираем их и уничтожаем и опять.
Подчеркиваю — после окончания прокачки сообщений ни одно сообщение не сохраняется — все уничтожены! То есть по идее мы должны выйти на то кол-во памяти, что было при запуске (ну ладно, пускай немного больше).
Итак, проблема:
чем больше порция данных, тем больше памяти остается "не у дел" и не возвращается системе после окончания прокачки сообщений. Причем мне лично непонятно — кто и зачем взял эту память и не отдает. Ведь это явно не утечка, а какое-то внутреннее выделение под какие-то нужды.
Чтобы смотреть сколько памяти занято программой я использую Process Explorer от SysInternals. Открываем процесс, выбираем вкладку Performance Graph и смотрим Private Bytes.
Итак, запускаем программу вначале с порцией в тысячу сообщений:
queue.exe 1000
Сразу после запуска видимо, что занято 348 Kb. Жмем Enter и ждем окончания прокачки. Смотрим и видим, что теперь Private Bytes равно 3.7 Mb
Теперь порция в 10000:
queue.exe 10000
После окончания процесс занимает 24.5 Mb памяти!
Ну и дальше, как вы уже догадались, все хужее и хужее:
queue.exe 100000 — 68.7 Mb!!
Ну и наконец:
queue.exe 250000 — 156 Mb!!!
Шедевр! Кто бы мне объяснил — что происходит?
Я могу понять, что STL внутри себя выделяет память. Я не могу понять — почему эта память обратно не вернулась??