Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.07.08;
Скачать: CL | DM;

Вниз

Ускорение работы программы   Найти похожие ветки 

 
Alex_C ©   (2007-06-14 16:50) [0]

Модернизирую одну старую программу:
она при выборе сотрудника из обычного текстового файла брала для него данные. Делалось это просто ReadLn - считывались строки начиная от начала (фаил не сортированный), и когда находилась нужная фамилия - строка с данными из файла выводилась на форму.
Т.к. текстовый фаил маленький - около 200к решил при загрузке проги его полностью считывать в память (array of String) и уже работать с этим массивом. Думал, что скорость увеличиться - но толи современные компы так быстро работают с диском, то ли еще что - скорость не увеличилась (покрайней мере визуально).
Вопрос: стоит ли так модернизировать программу? Ведь лишняя память (хоть и не много), но расходуется.


 
Johnmen ©   (2007-06-14 16:53) [1]

Читать из файла надо сразу всё одним блоком, а не кусочками по строке.
Используй TStringList.


 
Alex_C ©   (2007-06-14 17:01) [2]

То Johnmen: для информации - может я что-то не так делал, но StringList.LoadFromFile работает на несколько порядков медленнее ReadLN. Причина по видимому в том, что после чтения, StringList еще какие-то процедуры выволняет.
В общем от StringList отказался - медленнее значительно.
Да и не в этом вопрос! Я спрашиваю - перед началом работы стоит весь фаил в память грузить или нет? Ведь по времени работы разницы на глаз не видно.


 
Johnmen ©   (2007-06-14 17:04) [3]


>  Я спрашиваю - перед началом работы стоит весь фаил в память
> грузить или нет?

Смотря в чём заключается обработка.
ЗЫ
Прочитать можно BlockRead"ом сразу всё...


 
SpellCaster   (2007-06-14 17:06) [4]

Попробуй читать в буфер, а потом искать в нем ye;ye. фамилию процедурой AnsiPosStr


 
Dimaxx ©   (2007-06-14 17:13) [5]


> для информации - может я что-то не так делал, но StringList.
> LoadFromFile работает на несколько порядков медленнее ReadLN.
>

А как ты использовал? LoadFromFile читает сразу весь файл в список и хранится он там до уничтожения. Далее через TStringList.IndexOf ищем нужную строку (функция вернет индекс в списке). Если в строке несколько параметров - используй AnsiPos для поиска вхождения нужной части строки. Это будет всяко быстрее построчного считывания файла.


 
Alex_C ©   (2007-06-14 19:16) [6]


> Это будет всяко быстрее построчного считывания файла.


Тоже так думал. Ан нет! Считывал все в TSringList - работать с ним на порядок медленнее. Сам был весьма удивлен. Можешь сам попробовать. :)


 
SpellCaster   (2007-06-14 20:30) [7]

> Тоже так думал. Ан нет! Считывал все в TSringList - работать
> с ним на порядок медленнее. Сам был весьма удивлен. Можешь
> сам попробовать. :)

Потому что IndexOf в случае несортированного списка просматривает весь массив тупым перебором. Юзай [4], быстрее вряд ли что-то можно выдумать. Если только еще заюзать оптимизированную процедуру поиска подстроки (например, из пакета AcedUtils)


 
Arm79 ©   (2007-06-14 21:47) [8]


> SpellCaster   (14.06.07 20:30) [7]
> > Тоже так думал. Ан нет! Считывал все в TSringList - работать
>
> > с ним на порядок медленнее. Сам был весьма удивлен. Можешь
>
> > сам попробовать. :)
>
> Потому что IndexOf в случае несортированного списка просматривает
> весь массив тупым перебором. Юзай [4], быстрее вряд ли что-
> то можно выдумать. Если только еще заюзать оптимизированную
> процедуру поиска подстроки (например, из пакета AcedUtils)


А что мешает отсортировать список?


 
homm ©   (2007-06-14 22:34) [9]

> Думал, что скорость увеличиться - но толи современные компы
> так быстро работают с диском, то ли еще что - скорость не
> увеличилась (покрайней мере визуально).

При чтенмм первого же блока весь файл одной операцие чиения помещаеться в кеш жесткого диска, откуда уже блоками помельче перекачевывает в кеш операционной системы. Так что файл 200Кб — это не работа с жестким диском.


 
Johnmen ©   (2007-06-14 23:20) [10]


> При чтенмм первого же блока весь файл одной операцие чиения
> помещаеться в кеш жесткого диска,

Ты уверен? М.б. все-таки сектор, а не "весь файл"?


 
homm ©   (2007-06-14 23:37) [11]

> Ты уверен? М.б. все-таки сектор, а не "весь файл"?

Я вот не заню сколько это, сектор, на современных жестких дисках. Почему-то кажется, что чтение будет упреждающим в любом случае, даже при большой фрагментации вероятность обращения к следующему сектору в ближайшее время обычно куда больше вероятности не обращения.


 
SlymRO ©   (2007-06-15 06:34) [12]

Под рукой дельфи нет, но на память:
TMemIni (inifiles.pas) пользует THashList гляди в том направлении


 
SpellCaster   (2007-06-15 10:56) [13]

> А что мешает отсортировать список?
Предположим, есть большая группа детей, и надо найти ребенка с определенным ростом. Что легче - измерить рост у каждого, или же вначале выстроить их по ранжиру, а потом методом двоичного поиска найти нужного ребенка, учитывая, что все операции по сравнению и "перемещению" придется делать самому?


 
Arm79 ©   (2007-06-15 16:42) [14]


> SpellCaster   (15.06.07 10:56) [13]
> > А что мешает отсортировать список?
> Предположим, есть большая группа детей, и надо найти ребенка
> с определенным ростом. Что легче - измерить рост у каждого,
>  или же вначале выстроить их по ранжиру, а потом методом
> двоичного поиска найти нужного ребенка, учитывая, что все
> операции по сравнению и "перемещению" придется делать самому?
>


1) Рост не является уникальным ключом, соответственно при попытке найти ребенка по определенному росту, может выдаться несколько значений, в таком случае есть смысл в предварительном ранжировании

2) Смысл в предварительном ранжировании будет если поиск по росту будет многократным, тогда потери времени на предварителную обработку будут скомпенсированы скоростью поиска


 
SpellCaster   (2007-06-15 17:25) [15]

> [14] Arm79 ©   (15.06.07 16:42)

Возвращаемся к началу и смотрим задачу:
ReadLn - считывались строки начиная от начала (фаил не сортированный), и когда находилась нужная фамилия - строка с данными из файла выводилась на форму.

то есть
1) значение уникально
2) поиск производится 1 раз


 
Arm79 ©   (2007-06-15 17:41) [16]

А откуда вы взяли, что поиск проводится только раз? Я вот вычитал там, что конкретный сотрудник находится только раз, но сколько раз ищутся сотрудникИ - не указано. Что то не верится мне, что та программа каждый раз запускалась только для работы с ОДНИМ сотрудником... Значит несмотря на уникальность, вполне может быть второй случай - многократный поиск сотрудников.

И вообще, мы отклонились от темы, автор спрашивал, стоит ли заморачиваться с модернизацией программы если на глаз отличий по скорости нет. Я считаю что не стоит.

PS А факт увеличения расходуемой памяти на целых 200кб по моему перестал иметь какое либо значение еще лет 7 назад.


 
Alex_C ©   (2007-06-15 18:34) [17]

То Arm79: ты совершенно прав. Конечно сотрудники ищутся много, я бы даже сказал ОЧЕНЬ много раз! По этому и вопрос такой был.
И еще сейчас все попробвал: с одной строны увеличение на 200к - это сейчас вообще капля в море. С другой - как очень верно было сказано ReadLN в досе (где за раз считывалась только 1 строка) и сейчас - две большие разницы. Сейчас при обращении к диску данные с него считываются с запасом.
Итог для себя сделал такой: заморачиваться можно, но толку нет :)


 
Johnmen ©   (2007-06-15 18:44) [18]


> Сейчас при обращении к диску данные с него считываются с
> запасом.

Так было всегда. Ещё во времена ДОСа первой версии...:)


 
Alex_C ©   (2007-06-15 18:53) [19]


> Так было всегда. Ещё во времена ДОСа первой версии...:)


Однако разница при чтении из файла ReadLN и ReadBlock были в разы...


 
Johnmen ©   (2007-06-15 19:10) [20]


> Однако разница при чтении из файла ReadLN и ReadBlock были в разы...

Хм... BlockRead м.б.? Так можно сделать, что будут одинаковы. Если размер блока примерно = длине строки...



Страницы: 1 вся ветка

Текущий архив: 2007.07.08;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.022 c
9-1156069429
VolanD666
2006-08-20 14:23
2007.07.08
Статичные тени...


2-1181652161
evgenij_
2007-06-12 16:42
2007.07.08
Shape


2-1181651975
Kolan
2007-06-12 16:39
2007.07.08
FormResize срабатывает при закрытии приложения, как избежать?


4-1168978612
22b
2007-01-16 23:16
2007.07.08
Написание DLL для запуска из под Winlogon


8-1161756740
Mishenka
2006-10-25 10:12
2007.07.08
Как указать палитру в BMP ?