Сколько времени занимает очистка 1 ГБ памяти? - PullRequest
0 голосов
/ 16 декабря 2009

Сегодня мы обсуждали, как долго сбор мусора выходит из-под контроля. И было интересно, сколько времени потребуется, чтобы просто стереть 1 гигабайт памяти. Что бы это заняло?

Ответы [ 4 ]

15 голосов
/ 16 декабря 2009

На моей машине около секунды:

#include <stdlib.h>
#include <stdio.h>


const long long int NUM =  1024*1024*1024/8;

int main(void) {
    long long int* ptr = malloc(NUM  * sizeof ptr);
    printf("Gigabytes: %lld\n",NUM * sizeof ptr / 1024 / 1024 / 1024);
    for(int i=0;i<NUM;i++) {
        ptr[i]=1l;
    }
}

Затем я запускаю следующее (которое также неохотно измеряет время выделения:

$ gcc -O3 -std=c99 mem.c -o mem
$ time ./mem
Gigabytes: 1

real    0m1.056s
user    0m0.205s
sys  0m0.845s
11 голосов
/ 16 декабря 2009

Вы должны рассмотреть много элементов здесь. Я сомневаюсь, что универсальный сборщик мусора очищает память, когда связывает ее - это было бы пустой тратой времени. Это плюс сборщик мусора, как правило, не O (N). Сборка мусора обычно имеет несколько подпрограмм, которые она будет запускать - самая простая из упомянутых здесь будет сжатие, само сжатие основано на статистике распределения выделенной памяти. Другие фазы будут иметь аналогичные сложности ..

- редактировать после комментариев ниже и в вопросе -

Выбранный вами ответ не приближает вас к этому ощущению - на самом деле он полностью вводит в заблуждение - поскольку он не повторяется по структуре данных в памяти. Это просто грубая очистка памяти, которая не является задачей сборщика мусора.

Более точный ответ

Если вы хотите по-настоящему почувствовать сборщик мусора, я предлагаю написать приложение .NET или Java и инициализировать гигабайт памяти с различными размерами объектов, а затем случайным образом отбрасывать 100-300 МБ объектов и затем воссоздавать их опять случайных размеров; Сделайте это за несколько проходов, чтобы все перемешать. Следуйте этому, отключив сборщик, сбросив количество объектов и затем принудительно собрав ручные коллекции; Последняя коллекция мануалов - это то, что вы хотите сравнить - и вы хотите сделать это примерно 100 раз и построить результат.

Примечание о 20 мс

Я уверен, что есть способы заставить коллектора вести себя в режиме реального времени, если вы этого хотите. Сборщик не должен выполнять полную очистку, он может быть записан для выполнения в виде набора атомарных операций, и вы можете отключить этап сбора в режиме реального времени - то есть, 20 мс. В этом случае он сделал бы частичную коллекцию, которая все еще была бы полезна.

Вы должны будете скорректировать упомянутую мной стратегию, чтобы измерить, сколько можно сделать за 20 мс. Обязательно поймите, что количество собранных вещей больше зависит от количества присутствующих объектов, а не от их размера. Поэтому я предлагаю захватить оба значения, если вы решите официально протестировать GC.

2 голосов
/ 16 декабря 2009

Некоторое время назад я измерил пропускную способность памяти на нескольких последних моделях настольных компьютеров, тестируя с помощью пакетных передач, и получил постоянное число: примерно 5 гигабайт в секунду. Что очень хорошо соответствует номеру Нико, 0,205 секунды на концерт. 0,845 секунды системного времени сжигаются при выделении памяти. Это намного больше зависит от скорости вашего жесткого диска, состояния файла подкачки и количества страниц других программ, загруженных в ОЗУ, чем пропускная способность памяти.

Другими словами, все, что вы измеряете, вероятно, будет на 400% и более. Иногда намного больше.

2 голосов
/ 16 декабря 2009

Можно было бы ожидать, что возврат 1 ГБ памяти обратно в свободный пул будет просто некоторой простой манипуляцией с указателем. ГХ обычно не очищают память, возвращенную обратно.

Время для выделения 1 ГБ памяти зависит от того, что происходит в O / S в данный момент - вы должны настроить таблицы страниц и т. Д ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...