![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Модуль для создания списка ссылок из html страницы [D7, WinXP]
Krolm © (2008-08-05 18:22:00)Прошу оценить модуль, который отвечает за создание списка ссылок из html страницы. Хотелось бы услышать рекомендации в плане оптимизации, грамотности кода и расширения функционала.
Сорц не помещается в сообщении, так что прошу брать здесь:
http://www.procoding.ru/downloads/HTMLLink.pas
Palladin (2008-08-05 19:30:00) [1]+ и тем более TList
Krolm (2008-08-05 19:30:00) [2]Про то что компилятор не создаст копии если не модифицировать не знал. Спасибо за информацию.
Palladin (2008-08-05 19:29:00) [3]
> А сравнение делал array of string и TStringList.Код на массиве
> работал заметно быстрее.
А вот это уже другое, потому что TStringList это куда более сложный класс нежели array of
Palladin (2008-08-05 19:28:00) [4]
> Если передать как string (не через var) тогда в процедуру
> поступит копия памяти.
Нет, ты не прав. При любом раскладе, при передаче String, всегдапередается ссылка, бо переменная s:String - это указатель, другое дело если в процедуре/методе куда передана парметром переменная String произойдет попытка изменения этого параметра, только тогда создастся копия всех данных
например
Procedure (s:String);
Begin
ShowMessage(s);
End;
здесь никода не создастя копия данных s
Procedure (s:String);
Begin
...
ShowMessage(s); // до этой точки не будет копии данных
s:=Caption; // а вот здесь компилятор сгенерирует код по дублированию строки и назначит новому дубликату значение Caption
End;
префикс Const в параметрах лишь защита программиста от самого себя для предупреждения подобных ситуаций
Krolm (2008-08-05 19:28:00) [5]А сравнение делал array of string и TStringList.
Код на массиве работал заметно быстрее.
На счет объектов вы правы. Мне кажется в моем случае TObjectList по идее действительно должен быть быстрее.
Krolm (2008-08-05 19:23:00) [6]Pchar использовал потому что html может быть и по 500Кбайт. Если передать как string (не через var) тогда в процедуру поступит копия памяти. Это и долго и ресурсоемко.
Palladin (2008-08-05 19:23:00) [7]
> Я прав?
нет, в твоем случае, ты хранишь экземпляры объектов, кои по своей сущности, есть просто напросто указателина структуру в памяти (запомни это отличие объектов классов от экземпляров object и record), TList и TObjectList именно этим и занимаются, хранением указателей
Palladin (2008-08-05 19:20:00) [8]а еще точнее
THTMLLinkArray = class
private
LinksInside:TObjectList;
...
Function lcGetCount:Integer;
Function lcGetItem(p_nIndex:Integer):THTMLLink;
public
constructor Create;
destructor Destroy; override;
procedure Add( Consttext,address:string;properties:TPropertiesList);
procedure ParseNAdd(sp:pchar); // не совсем понятно зачем именно PChar
function GetFromText( Consttext:string):string;
Property Count:Integer Read lcGetCount;
Property Items[nIndex:Integer]:THTMLLink Read lcGetItem; Default;
end;
Krolm (2008-08-05 19:19:00) [9]Да я вот как-то тест проводил, сравнивал элементы, загнанные в TList и представленные как array
Массив работает на порядок быстрее, потому что экзепляры располагаются в памяти упорядоченно друг за другом, в то время как TList во-первых создает больше полей в памяти, а во вторых это список указателей из-за чего работа медленнее.
Я прав?
Palladin (2008-08-05 19:17:00) [10]+ возьми за привычку вводить префикс Const для переменных String и структур типа Record в параметрах методов
++ в идеале интерфейс THTMLLinksList должен выглядеть так
THTMLLinkArray = class
private
LinksInside:TObjectList;
...
Function lcGetCount:Integer;
Function lcGetItem(p_nIndex:Integer):THTMLLink;
public
constructor Create;
destructor Destroy; override;
procedure Add(text,address:string;properties:TPropertiesList);
procedure ParseNAdd(sp:pchar);
function GetFromText(text:string):string;
Property Count:Integer Read lcGetCount;
Property Items[nIndex:Integer]:THTMLLink Read lcGetItem; Default;
end;
Palladin (2008-08-05 19:13:00) [11]Еще замечание. Во первых переименовать THTMLLinkArray в THTMLLinksList
и использовать не LinksInside:array of THTMLLink;, а LinksList:TList или, что еще более удобней, TObjectList. Работать куда удобней и код в этих классах куда оптимальней.
Krolm (2008-08-05 19:04:00) [12]Задача стоит напрограммировать грамотно. Помимо ссылок, я разрабатываю классы для других элементов html. Хочется сделать все грамотно. На данный момент есть большой проект, где распарсивание происходит скриптово. В результате большой и ресурсоемкй код. Хочется все разложить по полочкам - чтобы загнал страницу, и получилось ее DOM дерево с элементами в виде соответствующих экземпляров классов, у каждого элемента свои поля и свои динамические свойства.
Medbe}I{onok XML (2008-08-05 18:59:00) [13]если по дизайну так вообще не понятно зачем там классы потребовались.
модуль с одной паблик функцией с листом для результата или callback параметром длдя универсальности.
в общем действительно похоже на программирование ради процесса программирования
Krolm (2008-08-05 18:58:00) [14]Спасибо за замечания. Действительно, стоящие.
Palladin (2008-08-05 18:54:00) [15]
> Medbe}I{onok XML © (05.08.08 18:26) [1]
ну как академическая задача - сабж прекрасен )
> Krolm © (05.08.08 18:36) [3]
1. смущает форматирование секции interface
2. класс THTMLlinks
очень рекомендую не отдавать в public сами переменные... вообще по идее public секция не должна содержать полей класса, только properties для доступа к ним, контролируя уровен read read/write
3. очень под вопросом производительность процедур
procedure RemoveSpaces(var s:string);
procedure RemoveQuotes(var s:string);
:) ну это так, не очень по существу, работают и работают... просто можно было сделать куда оптимальней
4. класс TPropertiesList красивше оформить методы Get,Index,Value в свойства, если что им позже можно будет присвоить модификатор Write
пока все... :)
Medbe}I{onok XML (2008-08-05 18:53:00) [16]среди сразу видимых залипух :
StrPosD и StrPosB
плюс нигде не видно обработки ссылок в апперкейсе
Medbe}I{onok XML (2008-08-05 18:40:00) [17]Ваше сообщение не в тему.
ты просил коментов, ты их получил.
Krolm (2008-08-05 18:38:00) [18]>закин на ящик timurrv на сервере mail.ru
Ушло.
Krolm (2008-08-05 18:36:00) [19]Функция распарсивания около 40 строчек. Ваше сообщение не в тему.
И потом в Delphi нет модуля, который реализует регулярные выражения. Сторонние решения использовать не хочу.
Palladin (2008-08-05 18:31:00) [20]закин на ящик timurrv на сервере mail.ru