Цитата(Elfebet @ 7.10.2006, 15:33 ) | | почему-то в делфях нельзя посмотреть код функции Pos. |
Посмотреть asm код функции Pos можно в модуле System.pas по ключевому слову _LStrPos. Или если поставить в настройках проекта галочку "Use Debug DCUs" и перейти на эту функцию по F7. Как написал Snowy, для поиска без учета регистра проще всего переводить искомую строку и текст, в котором осуществляется поиск к одному из регистров, например: | Код | i:=Pos(AnsiLowerCase(subS), AnsiLowerCase(S));
|
.
Цитата(Elfebet @ 7.10.2006, 15:33 ) | | что быстрее выполняется поиск текста чере цикл FOR или использование POS |
Зависит от задачи, но думаю в 90% случаев поиск будет быстрее осуществлен через Pos.
Вот, кстати, один из самых быстрых http://www.fastcode.dk/fastcodeproject/fastcodeproject/40.htm (регистрозависимый):| Код | function PosShaAsm5_b(const SubStr: AnsiString; const Str: AnsiString): Integer; asm push ebx push esi add esp, -16 test edx, edx jz @NotFound test eax, eax jz @NotFound mov esi, [edx-4] //Length(Str) mov ebx, [eax-4] //Length(Substr) cmp esi, ebx jl @NotFound test ebx, ebx jle @NotFound dec ebx add esi, edx add edx, ebx mov [esp+8], esi add eax, ebx mov [esp+4], edx neg ebx movzx ecx, byte ptr [eax] mov [esp], ebx jnz @FindString
sub esi, 2 mov [esp+12], esi
@FindChar2: cmp cl, [edx] jz @Matched0ch cmp cl, [edx+1] jz @Matched1ch add edx, 2 cmp edx, [esp+12] jb @FindChar4 cmp edx, [esp+8] jb @FindChar2 @NotFound: xor eax, eax jmp @Exit0ch
@FindChar4: cmp cl, [edx] jz @Matched0ch cmp cl, [edx+1] jz @Matched1ch cmp cl, [edx+2] jz @Matched2ch cmp cl, [edx+3] jz @Matched3ch add edx, 4 cmp edx, [esp+12] jb @FindChar4 cmp edx, [esp+8] jb @FindChar2 xor eax, eax jmp @Exit0ch
@Matched2ch: add edx, 2 @Matched0ch: inc edx mov eax, edx sub eax, [esp+4] @Exit0ch: add esp, 16 pop esi pop ebx ret
@Matched3ch: add edx, 2 @Matched1ch: add edx, 2 xor eax, eax cmp edx, [esp+8] ja @Exit1ch mov eax, edx sub eax, [esp+4] @Exit1ch: add esp, 16 pop esi pop ebx ret
@FindString4: cmp cl, [edx] jz @Test0 cmp cl, [edx+1] jz @Test1 cmp cl, [edx+2] jz @Test2 cmp cl, [edx+3] jz @Test3 add edx, 4 cmp edx, [esp+12] jb @FindString4 cmp edx, [esp+8] jb @FindString2 xor eax, eax jmp @Exit1
@FindString: sub esi, 2 mov [esp+12], esi @FindString2: cmp cl, [edx] jz @Test0 @AfterTest0: cmp cl, [edx+1] jz @Test1 @AfterTest1: add edx, 2 cmp edx, [esp+12] jb @FindString4 cmp edx, [esp+8] jb @FindString2 xor eax, eax jmp @Exit1
@Test3: add edx, 2 @Test1: mov esi, [esp] @Loop1: movzx ebx, word ptr [esi+eax] cmp bx, word ptr [esi+edx+1] jnz @AfterTest1 add esi, 2 jl @Loop1 add edx, 2 xor eax, eax cmp edx, [esp+8] ja @Exit1 @RetCode1: mov eax, edx sub eax, [esp+4] @Exit1: add esp, 16 pop esi pop ebx ret
@Test2: add edx,2 @Test0: mov esi, [esp] @Loop0: movzx ebx, word ptr [esi+eax] cmp bx, word ptr [esi+edx] jnz @AfterTest0 add esi, 2 jl @Loop0 inc edx @RetCode0: mov eax, edx sub eax, [esp+4] add esp, 16 pop esi pop ebx end;
|
|