Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.01.16;
Скачать: CL | DM;

Вниз

Функция разбивающая строку по разделителям...   Найти похожие ветки 

 
Knight ©   (2003-12-23 12:59) [40]

Пока самое быстрое у Fantasist © (23.12.03 02:07) [30]
На 3 сотни миллисекунд быстрее моего.
Хотя лишнего тоже много... :)


 
Sha ©   (2003-12-23 13:00) [41]

> Style © (23.12.03 11:28) [37]

lea eax, pointer(pstring)
Это тоже лишнее.


 
Style ©   (2003-12-23 13:05) [42]

2 - sha
2 - Knight ©

Да я не на скорость смотрел, а на то чтобы Separator - был string
короче как в PHP Explode

т.е. моя функция и ваши - совершенно разные вещи!

А вообще лучше возвращать не массив string"ов , а массив

TStringRec = record
Adddes: longint
Count: longint
end;

Чтобы лишний раз не копировать память.
Тогда будет быстро!


 
Sha ©   (2003-12-23 13:08) [43]

> Knight © (23.12.03 12:59) [40]

Скорее всего, это значит, что ты выбросил не все лишнее из моей функции :)
И уж если занялся сравнением скоростей, то замени во всех сравниваемых функциях TStringArray на TStringList, или наоборот.


 
Sha ©   (2003-12-23 13:10) [44]

> Style © (23.12.03 13:05) [42]
> Да я не на скорость смотрел

Я тоже. Я лишь комментировал asm-код.


 
Knight ©   (2003-12-23 14:10) [45]

>> Sha © (23.12.03 13:08) [43]
Выкинуд всё, что можно...
>> Style © (23.12.03 13:05) [42]
Могу сказать, что работает нормально :)
Вечером попробую ускорить...


 
Sha ©   (2003-12-23 14:27) [46]

> Knight © (23.12.03 14:10) [45]
> Выкинуд всё, что можно...

Покажи, что осталось.


 
Knight ©   (2003-12-23 14:29) [47]

>> Sha © (23.12.03 14:27) [46]
Снова править в лом... Буду дома часов в 9, закину.


 
Style ©   (2003-12-23 15:01) [48]

2 Sha ©
-> А там эти asm функции на скорость и не влияют.
Они вызываются один раз. В цикле нет орбащения.

в принципе
getstrlength
это тоже самое что

integer(pinteger(integer(@text)-4)^)


 
Sha ©   (2003-12-23 15:10) [49]

> Style © (23.12.03 15:01) [48]

> А там эти asm функции на скорость и не влияют.
Да не про скорость я, а про стиль. Эти операторы равны nop.

> в принципе getstrlength это тоже самое что integer(pinteger(integer(@text)-4)^)
И все это не равно length(@text)


 
Sha ©   (2003-12-23 15:11) [50]

И все это не равно length(text)


 
Style ©   (2003-12-23 15:32) [51]

Sha ©
должно быть равно.. или я сейчас не правильно записал

короче это указатель на укзатель в адресе @text - 4 типа longint

короче вот!

integer(pinteger(integer(pinteger(@s)^)-4)^)


 
Sha ©   (2003-12-23 15:51) [52]

Style © (23.12.03 15:32) [51]

Если строка пустая, твой код даст ошибку.


 
Style ©   (2003-12-23 16:36) [53]

Можно проверить на то что строка пустая....

А суть оптимизации в следующем - узнать адресс
где храниться text и засунуть в переменную
затем просто к этому адресу пребавлять pos в место того чтобы каждый раз при обращении к text узнавать его адресс


 
Fantasist ©   (2003-12-23 20:55) [54]


> Хотя лишнего тоже много...


А конкрентнее?


 
Fantasist ©   (2003-12-23 21:21) [55]

Возможен такой вариант. Он наверняка будет быстрее, если количество слов меньше BufferSize. В других вариантах не могу сказать, насколько быстро будет происходить перераспределение памяти по сравнению с изначальным подсчетом слов. По идее при достадочно большом BufferSize должно быть выгоднее.


function GetWords(const Text:string; Delimiters:set of char):TStrArr;
const
BufferSize=400;

var
st,cur:pchar;
tmp:string;
len,count:Cardinal;
begin
count:=0;
SetLength(Result,BufferSize);
cur:=pointer(text);

//пропустим разделители
while (cur^<>#0) and (cur^ in Delimiters) do inc(cur);
if cur^=#0 then exit;
st:=cur;

while cur^<>#0 do
begin
inc(cur);
if cur^ in Delimiters then
begin
if count=length(Result) then
SetLength(Result,length(Result)+BufferSize);

len:=Cardinal(cur)-Cardinal(st);
SetLength(Result[count],len);
move(st^,pointer(Result[count])^,len);
inc(count);

while (cur^<>#0) and (cur^ in Delimiters) do inc(cur);
st:=cur;
end;
end;

//последнее слово
if (st^<>#0) then
begin
len:=Cardinal(cur)-Cardinal(st);
SetLength(Result[count],len);
move(st^,pointer(Result[count])^,len);
end;
SetLength(Result,count);
end;


 
Knight ©   (2003-12-23 22:43) [56]

>> Sha
Остальная урезка, будет изменением кода...
<copy>
procedure Sha_RightMarkedTextToWords(const RightMarkedText: PChar; Words: TStrings; Mark: char);
var
start, stop: PChar;
len: integer;
wd: string;
ch: char;
begin;
words.Clear;
stop:=pointer(RightMarkedText);
if stop<>nil then repeat
start:=stop;
repeat
ch:=stop^;
inc(stop);
until (ch=Mark) or (ch=#0);
len:=stop-start-1;
SetString(wd,start,len);
Words.Add(wd);
until ch=#0;
end;
</copy>


 
Sha ©   (2003-12-23 23:04) [57]

Knight © (23.12.03 22:43) [56]
Не забыл заменить TStringList на TStringArray?


 
Игорь Шевченко ©   (2003-12-23 23:17) [58]

В UBPFD (ссылка в форуме "Основная", вверху) лежит функция StrBreakApart (в разделе "Работа со строками). Насколько я понял из комментариев, она похожа на Explode.


 
Knight ©   (2003-12-23 23:22) [59]

>> Sha © (23.12.03 23:04) [57]
Где? В твоём варианте? Это уже полная переделка... однако :)


 
Sha ©   (2003-12-23 23:50) [60]

> Knight © (23.12.03 23:22) [59]

А тогда не говори, что моя функция медленнее.
Сравнил... понимаешь...


 
Style ©   (2003-12-23 23:51) [61]

Ээээ народ вы мою обещали оптимизировать :)

Хочу 2 секунды!! :)


 
Sha ©   (2003-12-23 23:57) [62]

> Игорь Шевченко © (23.12.03 23:17) [58]

Рад видеть.
А моя-то Sha_RightMarkedTextToWords побыстрее будет :)


 
Игорь Шевченко ©   (2003-12-23 23:59) [63]

Sha © (23.12.03 23:57)


> Рад видеть.

Взаимно :)


> А моя-то Sha_RightMarkedTextToWords побыстрее будет

Охотно верю, я за скоростью не гнался, я честно взял за основу InfoPower"овскую :)) А они оптимизацией не отличались...



Страницы: 1 2 вся ветка

Текущий архив: 2004.01.16;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.029 c
1-49627
Depo
2004-01-04 16:01
2004.01.16
Перекрытие стандарных методов в компонентах


1-49495
AllDer
2004-01-03 00:54
2004.01.16
Движение панели мышью


6-49662
BlackSun
2003-11-15 11:04
2004.01.16
SSL


6-49659
ze
2003-11-16 15:44
2004.01.16
smtp server


1-49568
Ser_ega
2004-01-04 16:11
2004.01.16
StringGrid