Make(delphi) ver(4.04 build 184) P.S: у меня результаты таковы: time1 =0 Add(MainForm,1842996,308,231) { Width=313 Height=521 Caption="Т Е С Т" BorderStyle=1 Position=1 link(onCreate,14336781:doLoad,[]) } Add(Hub,14186092,245,273) { OutCount=5 link(onEvent1,4047973:doWork1,[(271,279)(271,267)(116,267)(116,279)]) link(onEvent2,5889051:doPos,[(337,286)(337,342)]) link(onEvent3,6506667:doPos,[(329,293)(329,412)]) link(onEvent4,15858068:doWork2,[]) link(onEvent5,4047973:doWork2,[(273,307)(273,325)(116,325)(116,286)]) } Add(ChanelToIndex,4047973,133,273) { link(onIndex,16052258:doVisible,[]) } Add(StrList,14336781,371,217) { FileName="www.txt" Strings=#7:www.txt| } Add(Label,6298121,469,231) { Left=5 Top=70 Width=299 Height=17 Font=[MS Sans Serif,8,0,255,1] Caption="$" } Add(Label,7440477,511,231) { Left=10 Top=30 Width=35 Height=17 Caption="Ищем" } Add(Label,12326515,553,231) { Left=20 Top=5 Width=279 Height=24 Font=[MS Sans Serif,12,1,0,1] Caption="Размер строки 81 437 774 байта" } Add(InlineCode,5889051,371,336) { @Hint=#19:Current 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 PosEx2(const SubStr, S: string; Offset: Integer = 1): Integer;|3:var|26: Ps, lp, ls, i : integer;|12: chr: Char;|31: BMT: array[Char] of integer; |5:begin|18: ls := Length(S);|0:|29: if Length(SubStr) <> 1 then|7: begin|25: lp := Length(SubStr);|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:|26: Ps := Offset + lp - 1;|0:|21: while Ps <= ls do|35: if (SubStr[lp] <> S[Ps]) then|29: Ps := Ps + BMT[S[Ps]]|11: else |31: for i := lp downto 1 do|45: if SubStr[i] <> S[Ps - lp + i] then|15: begin|34: Ps := Ps + BMT[S[Ps]];|18: Break;|13: end|28: else if i = 1 then|15: begin|34: Result := Ps - lp + 1;|17: Exit;|14: end;|7: end |6: else|7: begin|17: Ps := Offset;|21: chr := SubStr[1];|4: |21: while Ps <= ls do|28: if (S[Ps] <> Chr) then|20: Ps := Ps + 1|11: else |11: begin|21: Result := Ps;|13: Exit;|10: end;|10: end; |13: 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 := PosEx2(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.| link(onPos,13825338:doString,[]) link(text,10219259:Var2,[]) link(sbtext,10171368:Var1,[(384,320)]) AddHint(-103,46,112,13,@Hint) } Add(StringTable,13226389,609,294) { Top=90 Width=305 Height=350 Columns=#6:Имя=95|7:Позиция|17:Время (Мksec)=100| Grid=0 } Add(HubEx,15544549,588,294) { link(onEvent,13226389:doAdd,[]) } Add(FormatStr,13825338,532,336) { Mask="Nesco;%1" link(onFString,16377225:doWork2,[]) } Add(InlineCode,6506667,420,406) { @Hint=#14:NewPosEx (Asm)| WorkPoints=#5:doPos| EventPoints=#5:onPos| DataPoints=#4:text|5:sbstr| 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|16: text,sbstr,|21: onPos:THI_Event;|5: |50: procedure doPos(var _Data:TData; Index:word);|5: end;|0:|14:implementation|0:|71:function PosEx2(const S, SubStr: string; Offset: integer = 1): integer;|3:asm|16: PUSH EDI|16: PUSH ESI|16: PUSH EBX|16: PUSH EAX|18: OR EAX,EAX|14: JE @@2|18: OR EDX,EDX|14: JE @@2|15: DEC ECX|14: JS @@2|23: MOV EBX,[EAX-4]|19: SUB EBX,ECX|15: JLE @@2|23: SUB EBX,[EDX-4]|14: JL @@2|15: INC EBX|19: ADD EAX,ECX|19: MOV ECX,EBX|23: MOV EBX,[EDX-4]|15: DEC EBX|19: MOV EDI,EAX|0:|19:@@1: MOV ESI,EDX|13: LODSB|19: REPNE SCASB|15: JNE @@2|19: MOV EAX,ECX|16: PUSH EDI|19: MOV ECX,EBX|18: REPE CMPSB|15: POP EDI|19: MOV ECX,EAX|15: JNE @@1|23: LEA EAX,[EDI-1]|15: POP EDX|19: SUB EAX,EDX|15: INC EAX|15: JMP @@3|0:|15:@@2: POP EAX|19: XOR EAX,EAX|8: |15:@@3: POP EBX|15: POP ESI|15: POP EDI|4:end;|0:|28:procedure THiAsmClass.doPos;|3:var|16: sst,sb:string;|20: sp, ep, cnt:int64;|14: ps: integer;|5:begin|36: Sb := ReadString(_Data,sbstr,'');|36: Sst := ReadString(_Data,text,'');|31: QueryPerformanceCounter(sp);|29: Ps := PosEx2(sst,sb,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.| link(onPos,8643970:doString,[]) link(text,11275445:Var2,[]) link(sbstr,10171368:Var2,[]) AddHint(-148,38,96,13,@Hint) } Add(FormatStr,8643970,532,406) { Mask="NewPosEx (Asm);%1" link(onFString,14471385:doWork2,[]) } Add(HubEx,16377225,588,336) { Angle=3 link(onEvent,15544549:doWork3,[]) } Add(GetDataEx,10219259,371,301) { link(Data,14336781:Text,[]) } Add(GetDataEx,10171368,427,315) { link(Data,3936454:Caption,[]) } Add(Label,3936454,427,231) { Left=5 Top=45 Width=299 Height=17 Font=[MS Sans Serif,8,0,255,1] Caption="("Шевченко","пер","66000008000017900","624350","6615","","65448000000");" } Add(InlineCode,8405033,462,560) { @Hint=#19:Current 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 PosEx2(const SubStr, S: string; Offset: Integer = 1): Integer;|3:var|26: Ps, lp, ls, i : integer;|12: chr: Char;|31: BMT: array[Char] of integer; |5:begin|18: ls := Length(S);|0:|29: if Length(SubStr) <> 1 then|7: begin|25: lp := Length(SubStr);|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:|26: Ps := Offset + lp - 1;|0:|21: while Ps <= ls do|35: if (SubStr[lp] <> S[Ps]) then|29: Ps := Ps + BMT[S[Ps]]|11: else |31: for i := lp downto 1 do|45: if SubStr[i] <> S[Ps - lp + i] then|15: begin|34: Ps := Ps + BMT[S[Ps]];|18: Break;|13: end|28: else if i = 1 then|15: begin|34: Result := Ps - lp + 1;|17: Exit;|14: end;|7: end |6: else|7: begin|17: Ps := Offset;|21: chr := SubStr[1];|4: |21: while Ps <= ls do|28: if (S[Ps] <> Chr) then|20: Ps := Ps + 1|11: else |11: begin|21: Result := Ps;|13: Exit;|10: end;|10: end; |13: 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 := PosEx2(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.| link(onPos,5501725:doString,[]) link(text,12507222:Var2,[]) link(sbtext,9979819:Var2,[]) AddHint(-140,39,112,13,@Hint) } Add(Button,4831941,189,553) { Left=35 Top=445 Width=115 Font=[MS Sans Serif,10,1,0,1] Caption="One Char" Point(doVisible) link(onClick,8677829:doEvent1,[]) } Add(Button,16052258,189,273) { Left=160 Top=445 Width=115 Font=[MS Sans Serif,10,1,0,1] Caption="String" Point(doVisible) link(onClick,14186092:doEvent1,[]) } Add(FormatStr,5501725,532,560) { Mask="Nesco;%1" link(onFString,3471901:doWork3,[(592,566)]) } Add(GetDataEx,11275445,420,301) { Angle=3 link(Data,10219259:Var3,[]) } Add(Hub,8677829,245,553) { OutCount=5 link(onEvent1,16505973:doWork1,[(271,559)(271,547)(121,547)(121,559)]) link(onEvent2,8405033:doPos,[]) link(onEvent3,6485909:doPos,[(321,573)(321,496)]) link(onEvent4,15858068:doWork3,[(312,580)]) link(onEvent5,16505973:doWork2,[(270,587)(270,606)(121,606)(121,566)]) } Add(ChanelToIndex,16505973,133,553) { link(onIndex,4831941:doVisible,[]) } Add(HubEx,14471385,588,406) { Angle=3 link(onEvent,16377225:doWork3,[]) } Add(HubEx,15858068,308,294) { link(onEvent,15544549:doWork2,[]) } Add(InlineCode,6485909,483,490) { @Hint=#14:NewPosEx (Asm)| WorkPoints=#5:doPos| EventPoints=#5:onPos| DataPoints=#4:text|5:sbstr| 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|16: text,sbstr,|21: onPos:THI_Event;|5: |50: procedure doPos(var _Data:TData; Index:word);|5: end;|0:|14:implementation|0:|71:function PosEx2(const S, SubStr: string; Offset: integer = 1): integer;|3:asm|16: PUSH EDI|16: PUSH ESI|16: PUSH EBX|16: PUSH EAX|18: OR EAX,EAX|14: JE @@2|18: OR EDX,EDX|14: JE @@2|15: DEC ECX|14: JS @@2|23: MOV EBX,[EAX-4]|19: SUB EBX,ECX|15: JLE @@2|23: SUB EBX,[EDX-4]|14: JL @@2|15: INC EBX|19: ADD EAX,ECX|19: MOV ECX,EBX|23: MOV EBX,[EDX-4]|15: DEC EBX|19: MOV EDI,EAX|0:|19:@@1: MOV ESI,EDX|13: LODSB|19: REPNE SCASB|15: JNE @@2|19: MOV EAX,ECX|16: PUSH EDI|19: MOV ECX,EBX|18: REPE CMPSB|15: POP EDI|19: MOV ECX,EAX|15: JNE @@1|23: LEA EAX,[EDI-1]|15: POP EDX|19: SUB EAX,EDX|15: INC EAX|15: JMP @@3|0:|15:@@2: POP EAX|19: XOR EAX,EAX|8: |15:@@3: POP EBX|15: POP ESI|15: POP EDI|4:end;|0:|28:procedure THiAsmClass.doPos;|3:var|16: sst,sb:string;|20: sp, ep, cnt:int64;|14: ps: integer;|5:begin|36: Sb := ReadString(_Data,sbstr,'');|36: Sst := ReadString(_Data,text,'');|31: QueryPerformanceCounter(sp);|29: Ps := PosEx2(sst,sb,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.| link(onPos,12576747:doString,[]) link(text,12507222:Var3,[(489,460)]) link(sbstr,9979819:Var3,[(496,474)]) AddHint(-148,38,96,13,@Hint) } Add(FormatStr,12576747,532,490) { Mask="NewPosEx (Asm);%1" link(onFString,3471901:doWork2,[]) } Add(HubEx,3471901,588,490) { Angle=3 link(onEvent,14471385:doWork3,[]) } Add(GetDataEx,9979819,469,469) { link(Data,6298121:Caption,[]) } Add(GetDataEx,12507222,462,455) { link(Data,11275445:Var3,[(468,306)]) }