Почему так медленно?!

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Yann
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 31.08.2004 (Вт) 18:34

Почему так медленно?!

Сообщение Yann » 31.08.2004 (Вт) 18:47

Привет всем!
Хотел спросить, мож кто встречался с такой проблемой: :lol:

Загружаю страничку из инета и обрабатвываю её с помощью MSHTML Obj. Lib. вот код:
Код: Выделить всё
   Dim Doc     As New HTMLDocument
   Dim TR      As HTMLTableRow
   
   Show
     
   Doc.body.innerHTML = Module1.Refresh
   
   lv1.Visible = False
   imax = Doc.getElementsByTagName("TR").length - 1
   For i = 6 To imax
      DoEvents
      Caption = imax - i
      Set TR = Doc.getElementsByTagName("TR").Item(i)
      With lv1.ListItems
         .Add , , TR.cells.Item(0).innerText
         With .Item(.Count).ListSubItems
            .Add , , TR.cells.Item(1).innerText
            .Add , , TR.cells.Item(2).innerText
            .Add , , TR.cells.Item(3).innerText
            .Add , , TR.cells.Item(4).innerText
            .Add , , TR.cells.Item(5).innerText
            .Add , , TR.cells.Item(6).innerText
            .Add ' dummy
         End With
      End With
   Next
   lv1.Visible = True
   Caption = lv1.ListItems.Count
   
   Set Doc = Nothing
   Set TR = Nothing


Всё энто дело обрабатывается весьма долго по сравнению с моим парсером (где куча InStr'оф и Loop'оф).

Дык мой парсер по объёму в десять раз больше и работает в 10 раз быстрее :roll:

Парадокс какой-то. Родная библиотека для работы с ХТМЛ'ом так медленно работает, хоть и создана специально под ХТМЛ.
:?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 01.09.2004 (Ср) 11:32

Родная библиотека более универсальная.
А быстрее, чем InStr, в басике почти ничего нет.
Lasciate ogni speranza, voi ch'entrate.

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 01.09.2004 (Ср) 19:36

Вот, может чем-нибудь поможет... Несмотря на то, что skiperski "модифицировал" Replace, ИМХО, отсюда можно почерпнуть многое... :roll:
skiperski писал(а):Да, упорство и труд - всё перетрут! Как и ожидалось, функция работает при замене строк одинаковой длины быстрее! и почти в три раза быстрее стандарной!!! А если ещё оптимизировать функцию InStr()? Тогда не в два-три раза, а, быть может, в четыре-пять можно енто дело ускорить?

gaidar
System Debugger
System Debugger
 
Сообщения: 3152
Зарегистрирован: 23.12.2001 (Вс) 13:22

Сообщение gaidar » 01.09.2004 (Ср) 20:43

А вы посмотрите на .NET библиотеки для работы с html / xml - это просто сказка!

А насколько быстрее и как выглядит твой парсер?

Дело в том, что стандартная библиотека нужна, когда тебе необходимо парсить сложные документы, там она показывает неплохую производительность. Но, на простых примерах, такую странность замечали многие люди.
The difficult I’ll do right now. The impossible will take a little while. (c) US engineers in WWII
I don't always know what I'm talking about, but I know I'm right. (c) Muhammad Ali

marvan
Бывалый
Бывалый
 
Сообщения: 269
Зарегистрирован: 22.06.2004 (Вт) 13:26
Откуда: Москва

Сообщение marvan » 02.09.2004 (Чт) 9:44

Всё, что есть в топике Функция Replace - детский сад по сравнению vbspeed
например в скомпиллированном exe:
Код: Выделить всё
100 повторов               разная длина            одинаковая длина
VBA.StringsReplace         1,914 msec              1,901 msec
vbstreets:sЗaмeнaФpaг      1,336 msec              0,519 msec
vbstreets:Replace3_1       1,369 msec              1,137 msec
vbspeed:Replace09          0,877 msec              0,358 msec
vbspeed:Replace11          0,324 msec              0,179 msec


Так что рекомендую vbspeed
Там же есть масса других оптимизированных функций

Yann
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 31.08.2004 (Вт) 18:34

Сообщение Yann » 04.09.2004 (Сб) 21:17

marvan спасибо за ссылку на vbspeed!
Очень хороший ресурс — сразу же заюзал ParseCSV.

Кстати, причём тут replace? ведь чтоб вытащить значения тагов нужно юзать InStr.
Или я не прав?

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 04.09.2004 (Сб) 21:20

Я ж написал -
Я писал(а):может чем-нибудь поможет... Несмотря на то, что skiperski "модифицировал" Replace, ИМХО, отсюда можно почерпнуть многое...
Здесь интересный подход, да и сам skiperski написал, что "если еще и функцию InStr модифицировать!.."
Я не имел ввиду, что "вот тебе пример - пользуйся", я понимаю, что это не совсем то, но алгоритмы-то и отсюда можно взять! :roll:

Yann
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 31.08.2004 (Вт) 18:34

Сообщение Yann » 04.09.2004 (Сб) 21:36

Пасиб за попытку помочь :D, но увы…

Конечно то, что родные компоненты МС тАк медленно работают — обидно =(

Кстати, Гайдар писал:
парсить сложные документы, там она показывает неплохую производительность

Уверяю, что нет. Объем данных (которые нужно обработать) варьируется от 200 000 символов до 2 000 000. Всё-равно собственный парсер работает в 10 раз быстрее. :roll:

dr-vic
Обычный пользователь
Обычный пользователь
 
Сообщения: 65
Зарегистрирован: 13.01.2004 (Вт) 0:05

Сообщение dr-vic » 12.09.2004 (Вс) 0:12

Не знаю, может быть уже поздно, но...
У меня для тебя чисто практический совет - может и не сильно красиво, но работает. Я заранее извиняюсь за стиль подхода. Некоторое время назад я, также как и ты писал собственный парсер и в процессе наткнулся на такую вещь: компоненты и объекты из shdocvw и mshtml
(IE, WebBrowser, HTMLDocument) работают ЗНАЧИТЕЛЬНО быстрее, если в памяти уже
имеется один экзепляр данного компонента. То есть, на старте проги я теперь вставляю что-нибудь типа (для IE & HTMLDocument)
Код:
Private IE_background As InternetExplorer
.....
Sub Main()
.....
Set IE_background = New InternetExplorer
IE_background.navigate "about:blank"
.....
End Sub

Sub MySub()
Dim IE As InternetExplorer, IEDoc As HTMLDocument
IE.navigate .... ну и так далее.

Работает на порядок быстрее, чем просто работать c IE или WebBrowser. Время я не замерял, но видно даже "на глаз".
Есть минусы - отъедает память (для ИЕ - 11 056КБ), тормозит запуск и окончание программы.

А касательно собственного парсера - я, например, отказался от этой идеи.
С нынешним многообразием скриптов и прочего, если пытаться предусмотреть все - пропорционально падает скорость, ограничиваться основными тэгами -
падает качество и возрастает количество глюков.

Yann
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 31.08.2004 (Вт) 18:34

Сообщение Yann » 13.09.2004 (Пн) 23:12

гы. а теперь представь: прога весит "всего" 200КБ, памяти и так жрёт 5 мегов, а тут ещё 11 МБ ради одной ф-ии обработки?! :?

ЗЫ. Пришлось всё-таки остановиться на собственном парсере. =(, нежели юзать весьма удобный MSHTML Obj.

dr-vic
Обычный пользователь
Обычный пользователь
 
Сообщения: 65
Зарегистрирован: 13.01.2004 (Вт) 0:05

Сообщение dr-vic » 16.09.2004 (Чт) 0:49

Да, в принципе, я ж тебе не навязываю. Хозяин - барин! Учти только, что это 11 метров виртуальной памяти. Кроме того, "пустой" контрол можно подвешивать динамически перед пакетной обработкой, словом - варианты есть. А, в прочем, дело твое!

ASD
Модератор
Модератор
Аватара пользователя
 
Сообщения: 1758
Зарегистрирован: 07.12.2001 (Пт) 21:08
Откуда: Russia

Сообщение ASD » 19.09.2004 (Вс) 16:51

На вопрос Почему так меделенно отвечу так... Библа от MS представляет весь документ в виде аля обьектов, при этом следит за синтаксисом. А твоя программа тупо видет как текст и потому естессно быстрее. Но стоит сделать документ динамическим и твоя программа вылетит в глюк.. Т.к. у тебя жесткая зависимость.
Moderator VBStreets
---------------------------


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: SemrushBot и гости: 1

    TopList