Работаю с построчным выводом полигона на канву. Нужно много и быстро просчитывать координаты и возвращать их из функции. Вот думаю в чем лучше их хранить: в списке TList или заталкивать в динамический массив. Варианты только такие, т.к. результирующие массивы координат нужно вернуть из функции.
Что посоветуете? Delphi 7 не дот-нетовская.
Здравствуйте, Mihailo, Вы писали:
M>Работаю с построчным выводом полигона на канву. Нужно много и быстро просчитывать координаты и возвращать их из функции. Вот думаю в чем лучше их хранить: в списке TList или заталкивать в динамический массив. Варианты только такие, т.к. результирующие массивы координат нужно вернуть из функции.
Динамический массив быстрее, так как TList тот же динамический массив, но только указателей на данные, но это быстрее будет только в том случае, если будешь выделять размер массива весь сразу или хотя бы по тому же алгоритму, как и TList — переменным размером увеличения блока.
Здравствуйте, Mihailo, Вы писали:
M>Что посоветуете? Delphi 7
Ставлю на динмассивы.
... << RSDN@Home 1.1.4 beta 3 rev. 255 silent >>
Re: TList и динамические массивы - что быстрей?
От:
Аноним
Дата:
11.12.04 13:49
Оценка:
Здравствуйте, Mihailo, Вы писали:
M>Работаю с построчным выводом полигона на канву. Нужно много и быстро просчитывать координаты и возвращать их из функции. Вот думаю в чем лучше их хранить: в списке TList или заталкивать в динамический массив. Варианты только такие, т.к. результирующие массивы координат нужно вернуть из функции.
Лучше TList, т.к. он наращивает память кусками, эдакй кэш у него получается. А динамический массив каждый раз SetLength требует.
Re[2]: TList и динамические массивы - что быстрей?
Здравствуйте, <Аноним>, Вы писали:
А>Лучше TList, т.к. он наращивает память кусками, эдакй кэш у него получается. А динамический массив каждый раз SetLength требует.
Зато обращение к элементу идет гораздо дольше (в общем случае), т.к. элементы могут быть как угодно раскиданы по памяти
Лучший вариант — написать свой собственный TList на базе массива, выделять память "большими" кусками и т.п.
Есть множество готовых реализаций таких списков. Одна из них в замечательной книге Бакнелла "Фундаментальные алгоритмы и структуры данных в Delphi" Исходный код доступен на сайте издательства.
... По ушам лупит начальство
Re[2]: TList и динамические массивы - что быстрей?
Здравствуйте, Аноним, Вы писали:
А>Лучше TList, т.к. он наращивает память кусками, эдакй кэш у него получается. А динамический массив каждый раз SetLength требует.
А тебе кто мешает? TList использует тот же динамический массив и туже сабую функцию SetLength
Re[3]: TList и динамические массивы - что быстрей?
Здравствуйте, Anatoly Podgoretsky, Вы писали:
AP>Здравствуйте, Аноним, Вы писали:
А>>Лучше TList, т.к. он наращивает память кусками, эдакй кэш у него получается. А динамический массив каждый раз SetLength требует.
AP>А тебе кто мешает? TList использует тот же динамический массив и туже сабую функцию SetLength
а не удобнее использовать контейнеры STL?
Всё зависит от конкретной задачи!
Зависит от операций, которые будут выполняться с данными. В большинстве случаев ДМ будут быстрее, но например сортировка — скорее всего, быстрее в TList.
Тонкость в том, что TList очень легко "затормозить", если работать с ним неправильно. В частности, стоит помнить о свойстве TList.List.
Здравствуйте, Mihailo, Вы писали:
M>Работаю с построчным выводом полигона на канву. Нужно много и быстро просчитывать координаты и возвращать их из функции. Вот думаю в чем лучше их хранить: в списке TList или заталкивать в динамический массив. Варианты только такие, т.к. результирующие массивы координат нужно вернуть из функции. M>Что посоветуете? Delphi 7 не дот-нетовская.
Как уже сказали, динамический массив будет заведомо быстрее.
Но ни в коем случае не пиши такого кода:
SetLength(MyArray, Length(MyArray)+1);
Это — страшные тормоза. Вместо этого всегда переаллокируй крупными кусками. Оптимально хранить "указатель заполнения" и удваивать размер массива при достижении 100% (подробнее см. в сорцах TList)
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[2]: TList и динамические массивы - что быстрей?
Здравствуйте, Sinclair, Вы писали:
S>Как уже сказали, динамический массив будет заведомо быстрее. S>Но ни в коем случае не пиши такого кода: S>
S>SetLength(MyArray, Length(MyArray)+1);
S>
S>Это — страшные тормоза. Вместо этого всегда переаллокируй крупными кусками. Оптимально хранить "указатель заполнения" и удваивать размер массива при достижении 100% (подробнее см. в сорцах TList)