Форум: "Потрепаться";
Текущий архив: 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