![]() |
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]() ![]() ![]() |
|
mardoc |
|
|||
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 24.2.2011 Репутация: нет Всего: нет |
Есть рабочая функция удаления записей в массиве
Необходимо увеличить скорость работы функции. Так как при массивах более 10тыс записей становится мягко говоря не комфортно ![]() Это сообщение отредактировал(а) mardoc - 26.4.2011, 09:34 |
|||
|
||||
Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 192 Всего: 484 |
Нужно просто SetLength вынести за пределы цикла.
Вместо изменения размера, заведи переменную, куда сохраняй нужный размер. И уже по окончании цикла делай SetLength на нужный. Именно SetLength и кушает процессор. |
|||
|
||||
yahont7 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 25.4.2011 Репутация: нет Всего: нет |
Можно попробовать так:
|
|||
|
||||
mardoc |
|
|||
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 24.2.2011 Репутация: нет Всего: нет |
Спасибо за ответы .
Сделал проще перенес setLength за цикл:
код работает быстрее, но все равно медленно. :( Дело в том, что операции move приходиться переносить большие блоки в памяти, массив большой очень, в нем хранятся много всего. У меня, возможно, неверный подход к решению задачи!. А задача такова: необходимо фильтровать данные в массиве (фильтр задает пользователь). Для меня идеал по скорости фильрации это EXCEL ![]() Это сообщение отредактировал(а) mardoc - 26.4.2011, 17:06 |
|||
|
||||
MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
Отказаться от массива в пользу связанных списков. Там удаление будет делаться в разы быстрее)
Ну или TList. -------------------- There are always someone smarter than you... |
|||
|
||||
Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 192 Всего: 484 |
Перемещать нужно не сами записи, а указатели на них.
Ну и раз уж массив нефиксированного размера, то действительно, для данной задачи больше подходят списки - TList и его потомки. |
|||
|
||||
mardoc |
|
|||
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 24.2.2011 Репутация: нет Всего: нет |
С TList не хочется заводится слишком много кода переписывать. :(
Вот написал более-менее устраивающее решение (скорость раз в 100 быстрее), но у него есть свои минусы.
Добавлено @ 19:31 О, а можно пример ? ![]() Это сообщение отредактировал(а) mardoc - 26.4.2011, 20:09 |
|||
|
||||
yahont7 |
|
||||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 25.4.2011 Репутация: нет Всего: нет |
При каждом вызове этой процедуры, старый указатель на ProdArr будет затиратся новым TempArr, что приведет к утечки памяти, ибо весь стары динамический массив ProdArr будет оставаться в памяти а переменная ProdArr будет содержать указатель на вновь созданный TempArr.. С каждым вызовом процедуры удаления, оперативка будет грузится на целый (старый) массив ProdArr. Потому в таком случае надо переиначить твой код след образом:
|
||||
|
|||||
yahont7 |
|
||||||||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 25.4.2011 Репутация: нет Всего: нет |
Проще перейти на использование TList. Но при этом придется Использовать запись в виде указателя.
Соответсвено изменится и правила доступа к массиву.. прежде чем туда записать новый элемент, нужно будет под этот элемент выделить память процедурой New (и при удалении элемента не забыть про процедуру Dispose)... Так или иначе а лучше запись TProductRecord объявить как класс (за одно туда можно и функционал навесить в виде процедур и функций). А в качестве массива использовать хранитель указателей - объект TList. Вот например как можно переписать запись:
Добавление нового элемента в список
Както так в упрощенном виде. |
||||||||
|
|||||||||
mardoc |
|
|||
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 24.2.2011 Репутация: нет Всего: нет |
yahont7 Огромное спасибо за ответы. Реально помогли.
Попробую использовать TList в своих проектах. |
|||
|
||||
MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
Путаешь recordы и классы. Ничего там не будет "утекать". -------------------- There are always someone smarter than you... |
|||
|
||||
imageman |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 66 Регистрация: 30.9.2004 Репутация: 1 Всего: 1 |
я так понимаю, ты первоначально делал перемещение всех записей от текущей до конца, а потом перешел к перемещению одной записи в новый массив.
Возможно будет несколько быстрее воспользоваться копированием? Для record можно просто использовать присвоение (по типу ProdArr[0]:=ProdArr[100]). Если размер одного элемента ProdArr большой, то копирование содержимого ProdArr будет вестись долго при любых ухищрениях и нужно, как подсказал yahont7, использовать указатели. В этом случае будет копироваться не xxx байт записи, а 4 байта указателя на запись. И в сторону СУБД можно посмотреть (как универсальном хранилище данных). |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Общие вопросы" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |