Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 | 3 |

 

  Вопрос: Помогите ускорить код. Добавлено: 31.07.08 09:39  

Автор вопроса:  Abiron
На этом же сайте нашел код.
Function DeleteTags(Source)
     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
Function DeleteTags(ByVal Source As String) As String
     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
     ;DeleteTags = 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
строку по значению?

Как видишь, а почему нет? У него
при обработке примерно 20 кб текста страншо тормозит

А если там пару сотен МБ

То тут нам без твоих регулярных выражений не обойтись. Согласен регулярно выражаться? :)

Ответить

Номер ответа: 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

time sed -e 's/<[^>]*>//g' 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
а все последующие-вообще никак

Посмотрел ещё раз и не нашел там причины.
Может хоть ошибку какую выдаёт?

Ответить

Страница: 1 | 2 | 3 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам