Notes |
|
|
|
|
|
У меня репо нету, сами подправьте плиз. Я могу лишь подправить файлик и приложить его сюда. Приложил.
Для сравнения, реализация п.2 при поиске слова "красная" на файле 157М уменьшает время поиска с 25с до 3с (это без учёта времени чтения файла, которое тоже 3с). |
|
|
|
Репо скачивается 20 секунд. Сами сделаете пул реквест. |
|
|
(0008671)
|
Garl
|
03-09-2012 17:37
|
|
ок сейчас потестим и пульнём :)
|
|
|
(0008672)
|
Garl
|
03-09-2012 19:14
|
|
сделал, а затем увидел прикреплённый файл.
чуток оттуда займу оптимизаций, но уже на завтра. |
|
|
|
Garl, замечания по коммиту 433ff3ee8f27.
1. Строку 561 убрать! Из-за неё если текст найдётся не в теге Label, а в любом другом до него, то остаток до конца блока проверяться уже не будет! И соответственно может пропустить вхождение. В моём коде её и не было.
2. Зачем в строке 565 повторно вычисляется k? Оно же уже есть из строки 559 и гарантированно не меньше длины VStr2. А что дальше кучка лишних if i<k - наплевать, они всегда истинны, а времени тратят не много.
3. Зачем в строке 563 вырезается и конечный [END], он же всё равно далее нигде не нужен?
4. Зачем введена новая Vi, если и с i всё работало хорошо? Впрочем, как хотите.
5. Зачем используется VTempList если города можно сразу в VCityList запихивать? Не улавливаю преимущества лишней обёртки над TStringList. Но оставлю как есть.
6. Отступ назад до начала блока работает неправильно если в теге Label (или любом другом до него) встретится символ '['. Надо проверять что тег сидит в начале строки.
7. В строке 588 strtoint вылетит если код города неправильный или POI/POLYLINE принадлежит нескольким городам (а такое стандартом разрешено).
8. В строке 589 вылетит и индексация массива если код города неправильный (меньше 1).
9. Искать $D$A в строке 532 по всему файлу глупо, достаточно найти первый же $A и проверить предыдущий символ. Только пропустить самое начало файла, чтобы не уйти в минус.
10. Предлагаю если не найден тег [CITIES] в строке 534 не запускать весь цикл по списку городов. Сейчас куча лишних просмотров всего VStr.
11. Ну а если запускать, то после нахождения [END сразу отрезать блок в VStr2 и города извлекать уже из неё.
12. Поиск строки 'label=' и любого её подмножества найдёт СЛИШКОМ много лишнего.
13. В строках 557 и 562 индекс надо проверять до проверки массива. В реале это несущественно, за начало файла цикл и так не выйдет, но всё же.
14. Почему в строке 542 ищется конец строки с последующим тегом REGIONIDX?! А если дальше будет другой тег?!
Короче, всё это поправил и приложил обновлённый юнит.
Дальше оптимизировать смысла мало, скорости это уже не добавит.
Оставшиеся баги.
б1. Надо вообще все теги проверять что они в начале строки. А то мало ли что напишут в описаниях, вдруг в них встретится слово равное тегу?
б2. Неправильно обрабатываются списки городов, если точка/линия принадлежит нескольким городам. В вывод город не попадёт вообще.
б3. Вот бы по аналогии с городами обрабатывать индексы регионов и стран. |
|
|
(0008674)
|
Garl
|
04-09-2012 07:11
|
|
строка 531
if VStream.Size < 10 then exit; // файл слишком маленький
не катит ибо в строке 526 у нас VStream.Free; |
|
|
|
Упс, извиняюсь. Тогда так:
if length(VStr) < 10 |
|
|
(0008677)
|
Garl
|
04-09-2012 07:24
|
|
щас ещё погоняю ибо есть претензии к данным которые выводятся. |
|
|
|
По моему данный тикет можно закрывать как решенный? |
|