Вверх ↑
Этот топик читают: Гость
Ответов: 16884
Рейтинг: 1239
#151: 2010-04-26 20:09:27 ЛС | профиль | цитата
nesco писал(а):
FPos > 0 = False -- событие будет только тогда, когда _prop_ZeroPos = 0 (True)
а _prop_ZeroPos у нас когда равно 0 ?
При выборе в свойствах False или True ?
Чёт я совсем запутался.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26200
Рейтинг: 2137
#152: 2010-04-26 20:18:35 ЛС | профиль | цитата
Tad писал(а):
При выборе в свойствах False или True ?

Елы палы, индекс с чего начинается -- с нуля ЕМНИП. В данном случае, применяется индексный метод назначения свойств


ZeroPos=<Описание>|4|1|True,False

|4| -- целочисленный тип
|4|1| -- целочисленный тип с индексом умолчания = 1
True,False -- перечисление свойств с нулевого индекса

Стоит индекс по-умолчанию = 1, значит сойство по-умолчанию = False

_prop_ZeroPos = 0 эквивалетно _prop_ZeroPos = <True> и наоборот -- _prop_ZeroPos = 1 эквивалетно _prop_ZeroPos = <False>
карма: 22

0
Ответов: 16884
Рейтинг: 1239
#153: 2010-04-26 21:04:52 ЛС | профиль | цитата
Признаю - моя вина. Неверно выразился. Я писал "в тексте", а не "в кодах".
Tad писал(а):
A если _prop_ZeroPos = 1
Нужно было написать - а если в свойствах _prop_ZeroPos выбрано False (1)
Tad писал(а):
Ставишь _prop_ZeroPos = 0 (True) и всего делов
и здесь тоже - выбираешь в свойствах _prop_ZeroPos -> True (0).
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26200
Рейтинг: 2137
#154: 2010-04-27 17:49:17 ЛС | профиль | цитата
Tad, последняя редакция функции, оптимизировал, дальше некуда. У меня результат умопомрачительный, на трех символах поиска ("08) время чтения всего 13 msec, причем, все остальные показываеют паршивый результат



Add(InlineCode,2508260,469,469)
{
@Hint=#15:New Boyer-Moore|
WorkPoints=#5:doPos|
EventPoints=#5:onPos|
DataPoints=#4:text|6:sbtext|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|29:uses Windows,kol,Share,Debug;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|9: public|33: onPos,text,sbtext:THI_Event;|5: |50: procedure doPos(var _Data:TData; Index:word);|5: end;|0:|14:implementation|0:|71:function PosABM(const SubStr, S: string; Offset: Integer = 1): Integer;|3:var|22: lp, ls, i : integer;|12: chr: Char;|31: BMT: array[Char] of integer; |5:begin|18: ls := Length(S);|23: lp := Length(SubStr);|28: Result := Offset + lp - 1;|19: chr := SubStr[1];|8: |28: if Length(SubStr) > 1 then|7: begin|24: for i := 0 to 255 do|29: BMT[char(i)] := lp; |29: for i := 1 to (lp - 1) do|31: BMT[SubStr[i]] := lp - i;|0:|25: while Result <= ls do|9: begin|38: if (SubStr[lp] = S[Result]) then|35: for i := lp - 1 downto 1 do|51: if (SubStr[i] <> S[Result - lp + i]) then|17: Break|28: else if i = 1 then|15: begin|38: Result := Result - lp + 1;|17: Exit;|14: end;|40: Result := Result + BMT[S[Result]];|22: end; |7: end |6: else|25: while Result <= ls do|32: if (chr <> S[Result]) then|28: Result := Result + 1|11: else |13: Exit;|14: Result := 0;|4:end;|0:|28:procedure THiAsmClass.doPos;|3:var|16: sst,sb:string;|20: sp, ep, cnt:int64;|16: ps: integer; |5:begin|37: Sb := ReadString(_Data,sbtext,'');|36: Sst := ReadString(_Data,text,'');|31: QueryPerformanceCounter(sp);|26: Ps := PosABM(sb,sst,3);|31: QueryPerformanceCounter(ep);|34: QueryPerformanceFrequency(cnt);|26: cnt := cnt div 1000000;|76: _hi_onEvent(onPos, int2str(Ps) + ';' + int2str(integer((ep-sp) div cnt)));|4:end;|0:|4:end.|
AddHint(-103,46,100,13,@Hint)
}

карма: 22

0
Ответов: 16884
Рейтинг: 1239
#155: 2010-04-27 20:25:23 ЛС | профиль | цитата
не вижу. Может ты не то выложил ?

карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
файлы: 1testpos.png [5KB] [315]
Ответов: 8938
Рейтинг: 824
#156: 2010-04-27 20:53:10 ЛС | профиль | цитата
Tad, а у меня на длинных субстроках в 15-20 раз быстрее штатного, на коротких(4 символа) - в 900 раз, (3 символа) - аж в 20000 раз
------------ Дoбавленo в 20.53:
nesco, так держать!
карма: 19

0
файлы: 1position.jpg [33.9KB] [257]
Ответов: 16884
Рейтинг: 1239
#157: 2010-04-27 22:06:36 ЛС | профиль | цитата
Ну и кто мне объяснит мои результаты ?
nesco, ты на чем проверял ?
Я на списке улиц.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26200
Рейтинг: 2137
#158: 2010-04-27 22:24:41 ЛС | профиль | цитата
Леониди, твой результат и меня ошарашил, что-то не на том ты проверял, тк 28 usec цифра очень нереальная.

Tad писал(а):
ты на чем проверял ?

На списке улиц, на чем и всегда

Tad, у тебя, в компиляторе, включена оптимизация Ну не может новый код на Dephi работать медленнее старого, там количество комманд в цикле укорочено. Я же, когда его проверял, то сравнивал с текущим кодом, если бы он не давал существенный прирост, то использовать его имело смысл только из-за укороченности самого кода
Для чистоты эксперимента, попробуй вот такую строку компиляции


"%fname%"  "-U%upath%." -DSQLITE_OBJ -Q -$O+ "-E%opath%

А может, проц сказывается -- все может быть

карма: 22

0
Ответов: 8938
Рейтинг: 824
#159: 2010-04-27 22:35:23 ЛС | профиль | цитата
nesco, 28 usec - там позиция нашлась на 16-ом килобайте из 100 Мб
карма: 19

0
Разработчик
Ответов: 26200
Рейтинг: 2137
#160: 2010-04-27 22:38:03 ЛС | профиль | цитата
Леонид, что за слово искал и где, напиши его здесь. Млин, мне аж интересно стало
карма: 22

0
Ответов: 8938
Рейтинг: 824
#161: 2010-04-27 23:16:48 ЛС | профиль | цитата
nesco, вот со словом, на первой картинке не совсем верно - в код не глядел, а там время выводится а я через счётчик времени ещё раз засекал, так же, как и в стандартном; испытания надо проводить в одинаковых условиях, но всё равно, результат впечатлил
При переводе в компонент не забудьте свойство предусмотреть: "Первое слева, Первое справа, Найти все вхождения"
карма: 19

0
файлы: 1position.jpg [57.9KB] [193]
Разработчик
Ответов: 26200
Рейтинг: 2137
#162: 2010-04-27 23:44:40 ЛС | профиль | цитата
Леонид писал(а):
Первое справа

Совсем другой алгоритм, это на него не расчитан, менять надо. К тому же, никто не собирался из него делать компонент, это попытка найти замену штатному PosEx, который уже сдал позиции, осталось найти то, на что его заменить, то ли на asm-код, то ли на последний алгоритм Бойера-Мура

Леонид, IC коды заточены именно под определение скорости алгоритма, а не всей линкованной байды, на которой это время нивелируется
------------ Дoбавленo в 23.44:
Вот мой результат


карма: 22

0
файлы: 1test_9.png [8.1KB] [326]
Ответов: 16884
Рейтинг: 1239
#163: 2010-04-28 00:43:32 ЛС | профиль | цитата
Не получается у меня так



карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
файлы: 1testaa.png [10KB] [338]
Разработчик
Ответов: 26200
Рейтинг: 2137
#164: 2010-04-28 01:32:00 ЛС | профиль | цитата
Tad писал(а):
Не получается у меня так

Ну и что, результат-то и у тебя, на AMD, в среднем, не хуже первого алгоритма БМ. На процессоре Intel, результат -- гораздо эффективнее. И, глядя на твои результаты, уже можно сделать выводы, что БМ работает лучше asm-кода, что для меня и требовалось доказать

карма: 22

0
Ответов: 8938
Рейтинг: 824
#165: 2010-04-28 10:07:58 ЛС | профиль | цитата
nesco, на рисунке чистое время поиска штатного компонента и последнего IC с искомым словом и его длиной.
Чем длиннее искомая строка, тем меньше время поиска - это понятно для принятого алгоритма, но чем короче строка в которой ищется, тем меньше относительная разница между штатным компонентом и IC - не понятно почему
карма: 19

0
файлы: 1position.jpg [66.3KB] [228]
Сообщение
...
Прикрепленные файлы
(файлы не залиты)