@mrgloom

Как правильно замерять используемую память(Windows)?

Как правильно замерять используемую память в Windows(использую win7 x64, vs2010)?

Пример кода:
void test()
{
	int N=100*1000*1000;

	clock_t t;
	t= clock();

	std::vector<int> vec;
	vec.reserve(N);
	vec.resize(N);
	for(int i=0;i<N;++i)
	{
		vec[i]=10;
	}

	t= clock()-t;

	printf("mem: %d \n",sizeof(std::vector<int>)+vec.capacity()*sizeof(int));
	printf("test run: %d tics , %f sec \n",t, ((float)t)/CLOCKS_PER_SEC);

	getchar();
}


Допустим хочу знать сколько места занимает vector определенного размера.
На остановке на строчке getchar() смотрю в task manager сколько места занимает программа:

Результаты:
kb N
4280 1M
39504 10M
78636 20M
391752 100M

Что то не прослеживается точной линейной зависимости, правильно ли я понимаю, что модель тут такая
N*sizeof(int)+const_vector_overhead+const_programm_overhead?

UPDATE:
Немного усложним задачу:
void test()
{
	int N=10*1000*1000;
	int K=10;

	clock_t t;
	t= clock();

	std::vector<std::vector<int>> vec;
	vec.reserve(N);
	vec.resize(N);
	for(int i=0;i<N;++i)
	{
		vec[i].reserve(K);
		vec[i].resize(K);
		for(int j=0;j<K;++j)
			vec[i][j]=10;
	}

	t= clock()-t;

	printf("mem: %d \n",sizeof(std::vector<std::vector<int>>)+vec.capacity()*sizeof(int));
	printf("test run: %d tics , %f sec \n",t, ((float)t)/CLOCKS_PER_SEC);

	getchar();
}


Получаем ~ 1 250 000 Kb , что примерно в 3 раза больше чем 100М vector
Еще интерестно что в vmmap heap показывается как 1 кусок ~300 Мб, много кусков по 16 192 Кб, несколько кусков еще меньшего размера, всего кусков 68.
Так что же это за куски?
  • Вопрос задан
  • 2385 просмотров
Пригласить эксперта
Ответы на вопрос 2
gbg
@gbg Куратор тега C++
Любые ответы на любые вопросы
Первая странность - reserve, а сразу потом - resize. Достаточно только resize(). Кроме этого, у resize есть второй параметр, специально для заполнения вновь создаваемых элементов. Вместо
vec.reserve(N);
  vec.resize(N);
  for(int i=0;i<N;++i)
  {
    vec[i]=10;
  }

Можно было написать ровно один вызов resize().
Второе - не следует забывать, что с точки зрения ОС, единица отдачи памяти приложению - страница, а страница это обычно 4 килобайта.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы