Показать сообщение отдельно
Старый 16.11.2016, 03:08   #7
DarkInside
Разработчик
 
Аватар для DarkInside
 
Регистрация: 08.08.2011
Сообщений: 505
Написано 191 полезных сообщений
(для 369 пользователей)
Ответ: Быстрая работа со строками

И то и другое. Главное, чтоб работало быстрее. Нужна быстрая альтернатива функциям Left, Right, Instr.

Вот алгоритм Бойера-Мура на практике, де-факто самый быстрый алгоритм поиска подстроки в строке (Реализация на FreeBasic с вставкой Asm):

Быстрее в 10 раз обычного Instr.

#INCLUDE "crt.bi"

Function InStrZ naked( start As Integer, _
    s1 As Zstring Ptr, _
    s2 As Zstring Ptr ) As Integer
    Asm
        mov ecx, [esp+8]            '' get pointer to s1
        mov edx, [esp+12]           '' get pointer to s2
        movzx eax, Byte Ptr [ecx]   '' get first char
        test eax, eax               '' test for null string
        jz 0f                       '' return zero
        movzx eax, Byte Ptr [edx]   '' get first char
        test eax, eax               '' test for null string
        jz 0f                       '' return zero
        push ecx                    '' preserve ecx around call
        ''--------------------------------------------
        '' The extra '+4' below is to correct for the
        '' effect of the 'push ecx' above on ESP.
        ''--------------------------------------------
        Add ecx, [esp+4+4]          '' correct for start position
        dec ecx                     '' correct for change in base
        push edx                    '' push pointer to s2
        push ecx                    '' push corrected pointer to s1
        Call StrStr                 '' call CRT strstr function
        Add esp, 8                  '' remove parameters from stack
        pop ecx                     '' recover ecx
        test eax, eax               '' test for substring not found
        jz 0f                       '' return zero
        Sub eax, ecx                '' subtract address of s1 data
        inc eax                     '' adjust return value to base 1
        0:
        ret 12                      '' return and remove parameters from stack
    End Asm
End Function
(Offline)
 
Ответить с цитированием