Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2004.01.16;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.56 MB
Время: 0.013 c
14-49769
sever-Rds
2003-12-24 01:40
2004.01.16
Клановость во власти


1-49614
RoLeX
2004-01-03 14:17
2004.01.16
Как заставить включить/выключить лампочки Caps/Num/Scroll Lock ??


1-49613
TUser
2004-01-05 07:49
2004.01.16
Trace hook


14-49696
Ega23
2003-12-26 09:39
2004.01.16
А кто вчера тоже пил?


1-49615
TUser
2004-01-05 07:46
2004.01.16
GIF





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский