Страница 1 из 1

Время выделения памяти для динамического массива

СообщениеДобавлено: 28.03.2015 03:36:52
avi9526
Здравствуйте!

Пишу ненужную программку чтобы не было скучно. По пути написания есть проблемка…

Суть такова: создается массив байтов ("array of Byte", длину меняю командой "SetLength"), который интерпретируется как массив элементов, размер которых S-байт и которые заполняются нулями (использую "system.FillChar"). Один раз я выделяю сразу всю память под все элементы (их у меня "$100000"), другой раз добавляю элементы по одному (циклом "for"), а память под них выделяю кусками - добавляю большой кусок (размер куска T-байт) если места не хватает (т.е. память добавляется про запас и только если надо). Пробовал для разных размеров элементов (1 байт, 1025 байт, 2049 байт) и разных размеров кусков для добавления памяти (от 1 до 268435456 байт). И получился такой график
Изображение
- по оси X - размер куска для добавления памяти T; по Y - время выделения памяти под элемент и заполнения его нулями (ну и немного всяких проверок)
- белые кружочки - добавление всех элементов и памяти под них сразу (очевидно, не зависит от размера куска)
- черные кружочки - поэлементное добавление и выделение памяти кусками

Получается, что добавление памяти кусками по 524288 и больше байт занимает больше времени чем выделение той же памяти меньшими кусками (хоть и большим числом раз). Это мне не понятно. Имеется ли этому логическое объяснение (кроме того, что я мог жутко затупить при написании кода)?

Re: Время выделения памяти для динамического массива

СообщениеДобавлено: 28.03.2015 12:54:19
zub
Предположу что если все замеры производятся в одном сеансе программы, а выделение большого куска памяти после множества мелких выделений - возможно влияет фрагментация памяти.