Страница: 1 | 2 | 3 |
Вопрос: Помогите ускорить код.
Добавлено: 31.07.08 09:39
Автор вопроса: Abiron
На этом же сайте нашел код.
pos1 = InStr(Source, "<")
pos2 = 1
Do While (pos1 > 0) And (pos2 > 0)
If pos1 > 0 Then
pos2 = InStr(pos1, Source, ">")
End If
If pos2 = 0 Then
Source = Left(Source, pos1 - 1)
Else
Source = Left(Source, pos1 - 1) & Right(Source, Len(Source) - pos2)
End If
pos1 = InStr(Source, "<")
Loop
DeleteTags = Source
End Function
Он удаляет все что мужду < и >. Но при обработке примерно 20 кб текста страншо тормозит. Можно ли его как упростить?
Ответы
Всего ответов: 35
Номер ответа: 1
Автор ответа:
Smith
ICQ: adamis@list.ru
Вопросов: 153
Ответов: 3632
Профиль | | #1
Добавлено: 31.07.08 11:10
Dim Pos1 As Long
Dim Pos2 As Long
Pos1 = InStr(Source, "<"
Pos2 = 1
Do While Pos1 And Pos2
Pos2 = InStr(Pos1, Source, ">"
If Pos2 Then
Source = Left$(Source, Pos1 - 1) & Right$(Source, Len(Source) - Pos2)
Else
Source = Left$(Source, Pos1 - 1)
End If
Pos1 = InStr(Source, "<"
Loop
 eleteTags = Source
End Function
Номер ответа: 2
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #2
Добавлено: 31.07.08 16:25
2 Smith: строку по значению? А если там пару сотен МБ? А юникод это 2 байта.. т.е. 200 мб будет )) ладно.. в прочем ByRef тоже не поможет )
Тут два пути ускорения:
1) Выкинуть этот код, и написать на RegExp.
2) Выкинуть этот код, и написать на C++.
Номер ответа: 3
Автор ответа:
Smith
ICQ: adamis@list.ru
Вопросов: 153
Ответов: 3632
Профиль | | #3
Добавлено: 31.07.08 16:51
Как видишь, а почему нет? У него
То тут нам без твоих регулярных выражений не обойтись. Согласен регулярно выражаться?
Номер ответа: 4
Автор ответа:
User Unknown
Вечный Юзер!
ICQ: uu@jabber.cz
Вопросов: 120
Ответов: 3302
Профиль | | #4
Добавлено: 31.07.08 16:55
А ты ему скармливаешь информацию построчно или всем куском?
ls -lah text.txt
547K Июл 31 16:36 text.txt
real 0m0.145s
user 0m0.143s
sys 0m0.003s
Да, есть куда улучшать код.
Ради интереса засунул файл на 54 мегабайта (эта страница размноженная)..
real 0m15.127s
user 0m14.629s
sys 0m0.080s
Номер ответа: 5
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #5
Добавлено: 31.07.08 17:10
Регулярными выражениями не будет быстрее чем своим кодом.
По сути, я думаю основной тормоз происходит здесь:
Source = Left(Source, pos1 - 1) & Right(Source, Len(Source) - pos2)
Номер ответа: 6
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #6
Добавлено: 31.07.08 17:10
линуксоиды атакуют...
Номер ответа: 7
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #7
Добавлено: 31.07.08 17:11
Просто например накапливай результаты в коллекции, потом после работы кода склеить ее в одну строку, вобщем не знаю какие в VB6 есть методы для накопления строки, в .NET это StringBuilder.
Номер ответа: 8
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #8
Добавлено: 31.07.08 17:11
Номер ответа: 9
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #9
Добавлено: 31.07.08 17:30
А вдруг не Closed, надо ж проверить
Номер ответа: 10
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #10
Добавлено: 31.07.08 17:31
ой-ё-ёй не сюда ) сорри
Номер ответа: 11
Автор ответа:
Abiron
Вопросов: 30
Ответов: 62
Профиль | | #11
Добавлено: 31.07.08 17:35
Smith твой код работает классно. В пять раз быстрее, но только один раз. Незнаю почему, но первый раз работает отлично, а все последующие-вообще никак.
Номер ответа: 12
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #12
Добавлено: 31.07.08 17:35
А блин.. Произошла неизвестная ошибка при сохранении сообщения Дурите вы, всё вам там известно
Номер ответа: 13
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #13
Добавлено: 31.07.08 18:24
Ничего спорного.
Ранее тут уже я делал код выдирания E-mail'ов который на порядки обгонял аналогичное регулярное выражение.
Номер ответа: 14
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #14
Добавлено: 31.07.08 18:52
Рег. выраж. если его грамотно написать, при этом оно получится не очень сложное, оно в полне может потягаться с кодом. Т.к. я предполагаю, что конечный автомат регулярки написан на чем-то более низкоуровневом, чем VB6, с его тормознутыми строками. На .NET - да возможно кодом быстрее, т.к. .NET по человечески работает со строками.
Номер ответа: 15
Автор ответа:
Smith
ICQ: adamis@list.ru
Вопросов: 153
Ответов: 3632
Профиль | | #15
Добавлено: 31.07.08 18:52
Посмотрел ещё раз и не нашел там причины.
Может хоть ошибку какую выдаёт?