Каков хороший размер для выделения памяти среднего размера? - PullRequest
0 голосов
/ 07 апреля 2011

Для системы сериализации мне нужно выделить буферы для записи данных.Необходимый размер заранее неизвестен, поэтому базовый шаблон должен составлять malloc N байт и использовать realloc, если требуется больше.Размер N будет достаточно большим, чтобы вместить большинство объектов, что делает перераспределение редким.

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

Теперь я уверен, что это бесполезная оптимизация, и если это действительно имеет значение, ямог бы использовать бассейн, но мне любопытно;Я не могу быть первым программистом, который подумает, что даст мне любой кусок байтов, который проще всего выделить в качестве начала .Есть ли способ определить это?

Любой ответ на этот вопрос, который конкретно относится к современным GCC / G ++ и / или Linux, будет принят.

Ответы [ 3 ]

2 голосов
/ 07 апреля 2011

После прочтения этой вики-страницы ваш ответ может сильно отличаться в зависимости от используемой вами реализации malloc и ОС.Чтение битов в malloc OpenBSD особенно интересно.Звучит так, будто вы тоже хотите взглянуть на mmap, но я бы сказал, что выделение размера страницы по умолчанию (4096?) Было бы оптимизировано для.

1 голос
/ 25 апреля 2011

Я предлагаю вам найти соответствующий исходный код malloc / realloc / free, чтобы вы могли реализовать свой собственный "malloc_first" вместе с другими в том же модуле исходного кода (и используя те же структуры памяти), который просто выделяет ивозвращает первый доступный блок, больший или равный переданному параметру минимум_байт.Если 0 пройдено, вы получите первый период блокировки.

Подходящим объявлением может быть

void *malloc_first (size_t minimum_bytes, size_t *actual_bytes);

Насколько выполнимо такое начинание, я не знаю.Я предлагаю вам попробовать это с помощью Linux, где доступны все исходные коды.

0 голосов
/ 07 апреля 2011

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

Итак, если сначала вы выделите 100, в следующий раз вы будете realloc 200, затем 400, 800 и так далее.Таким образом, шансы на последующее перераспределение будут ниже после каждого того, как вы это сделаете.

Если память мне не изменяет, то вот как std::vector ведет себя.

после редактирования

Оптимальный начальный размер распределения будет таким, который охватит большинство ваших дел с одной стороны, но не будет слишком расточительным с другой.Если ваш средний случай равен 50, но может увеличиться до 500, вы захотите выделить сначала 50, а затем удваивать или утроять (или умножать на 10) каждый следующий realloc, чтобы вы могли получить 500 в 1-3 realloc с, но дальнейшие realloc с были бы маловероятными и редкими.Так что, в основном, это зависит от ваших моделей использования.

...