OdesitVadim
![](http://forum.ru-board.com/board/avatars/p8.gif)
Advanced Member | Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору EvSeKo Сама по себе функция не такая уж и медленная. Идея в другом. Когда Вы пишете безобидную конструкцию SetLength(a,length(a)+1) за кулисами происходит очень "страшные вещи". Вначале выделяется кусок памяти необходимого размера (не дотачивается, а именно выделяется ещё один, хотя в некоторых случаях может быть запас места и Делфи воспользуется этим, к примеру TStringList, смотреть в сторону Capacity)Потом с старого копируется в новый и старый освобождается. Пока блоки памяти маленькие (по некоторым расчётом - до 4 кило) делфовский менеджер сравнительно быстро разруливает такие блоки, но когда счёт идёт на мегабайты.... (молчу ) Скорость. По моим замерам и некоторых других людей скорость доступа к элементам динамического масива против статического меньше в 2 - 3 раза. Что же делать? Менять идеологию. Вот пример Неоптимальный код Код: var a:array of integer; i:integer; begin for i:=1 to 10000 do begin Setlength(a,i); a[i]:=i; end; | Это же, но оптимально Код: var a:array of integer; i:integer; begin Setlength(a,10000); for i:=1 to 10000 do begin a[i]:=i; end; | Сразу скажу, что первый вариант будет иметь геометрическую зависимость скорость/кол.элемент, если не хуже, а второй - константное или близкое к этому. Что делать, если нереально предположить, скоко элементов в массиве будет, то пользуемся правилом "лучше с излишком". Но если и так не удоволетворяет, что делать? Пользоваться системными функциями выделения памяти и использовать указатели или написать свой менеджер памяти. Но эта задача для прикладников часто "из области фантастики" - зачем для проги в 10 строк писать ещё 1000, что бы быстрей работало? Хотя если есть необходимость, то можно покурить в сторону FastMem, в BSD2006 его говорят включили.
---------- Press any key to continue or any other key to exit Пишите так, чтобы не было стыдно за нобелевскую премию. |
|