Страница: 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
Посмотрел ещё раз и не нашел там причины.
Может хоть ошибку какую выдаёт?