| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > StringList |
| Автор: z-END 23.1.2005, 12:00 | ||||
| Вот тестовая прога, ничего умного она не делает=) просто засекает время выполнения двух вещей: 1. Добавление элементов в StringList 2. Получение индекса сторки из StringList Вообщем я впал в ужас..
Кому лень запускать привожу результаты работы:
Чуть про вопрос незабыл=) возможно ли ускорить этот процесс? т.к. у меня в списке (запланировано) до 300 тыс. строк. Да, индексирование я использую для определения наличия данной строки в списке, (все строки уникальны) может есть более оптимальные варианты? |
| Автор: Alex 23.1.2005, 12:24 |
| http://vingrad.ru/DELPHI-SRC-002243 |
| Автор: z-END 23.1.2005, 12:36 |
| Alex анд что? |
| Автор: Alex 23.1.2005, 12:38 | ||||||
Добавлено @ 12:39
Модуль дя более точного засекания времени Добавлено @ 12:41
|
| Автор: z-END 23.1.2005, 12:42 |
| Слона-то я и не заметил=) Alex, очередное спасибо! ЗЫ, да мне точно и ненадо было, так просто сравнить разницу.. |
| Автор: Alex 23.1.2005, 12:47 |
| Причину знаешь почему так произошло? |
| Автор: Петрович 23.1.2005, 12:52 | ||||||
Ну, тут как всегда. Очевидное решение не всегда самое эффективное. Давай, несколько модифицироуем твой приммер:
До модификации:
После:
А еще: 1. Application.ProcessMessages в консольных приложениях - это лишнее. 2. Нужно выносить действия инвариантные к циклу, за его пределы. Но это ты уже сам |
| Автор: z-END 23.1.2005, 13:06 | ||
| Alex чесно говоря несовсем=) так-что c радостью готов услышать! Петрович ProccessMessages я использовал только для того чтобы приблизить результаты к другой софтине, которая совершенно не консольная=) (кстати в ней то-же код работает намного медленней) а вот про второй пункт я несовсем понял ЗЫ а вот результат сортировонного списка:
|
| Автор: Alex 23.1.2005, 13:18 |
| 1 Ссылка на модуль для замера времени исполнения теперь http://vingrad.ru/DELPHI-SRC-002244 |
| Автор: Петрович 23.1.2005, 13:18 | ||||
Ну да, в отсортированном конечно поиск быстрее. Всетаки используется алгоритм QuickSearch
Я имел ввиду что преобразование IntToStr тоже занимает чувствительнгое время, хотя совершено не имеет отношения к исследуемой функции. Если его вынести за пределы цикла, например подготовив зарание массив испкомых строк, то работать будет несколько быстрее. Но все равно, лвиную долю времени занимает конечно поиск. |
| Автор: Alex 23.1.2005, 13:28 | ||||||||
Дело в том, что если посмотреть на реализацию метода IndexOf, то можно увидеть, что в нем по-разному происходит поиск в отсортированном и не отсортированном списке
Если список, не отсортированный, то дергается базовый метод типа TStrings
Он не эффективен по той причине, что постоянно идет перебор всех элементов списка. Если же сортировка включена, то выборку можно осуществить гораздо быстрее по методу деления по полам. Это когда весь ОТСОРТИРОВАННЫЙ массив бьется на 2 и определяется, к какой части относится элемент, который ищут. Дальше эту уже часть опять делят на 2 и так далее пока не найдут нужный элемент.
|