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