Татарин>> Поставь задачу явно. Сейчас посмотрим.
3-62> Случай попроще и пораспространенней. В тексте программы найти переменную "New_Batch".
3-62> Случай посложнее. В тексте статьи найти упоминание "предел прочности композитного материала". С учетом того что "композитные материалы с прочностью" - тоже желательно находить.
Ну вот и смотрим.
Случай 1.
Первая строка: "New_Ba", "tch\0\0\0"
Делаем выборку первого слова текста программы (str[0]). Счётчик (i) ставим в 1, счетчик искомого слова k=0.
Далее в цикле делаем следующее: выбираем следующее слово str[i].
Далее в цикле со счётчиком l начиная с 0 до 5 (48 бит) 6 раз:
Сравниваем с текущим (тоже начиная с первого) словом искомой строки s[k] предыдущее слово str[i-1].
Сдвигаем регистр, в котором str[i] в регистр, в котором str[i-1] на 8 бит, сравниваем с s[k]
Если совпадение, выходим из цикла
Если совпадения нет, продолжаем...
и если совпадения нет все 6 раз - переходим к выборке нового слова str[i]
Если мы вышли из цикла с совпадением, запоминаем счётчик l, умножаем его на 8 (сдвигаем на 3 влево).
Далее все выбранные слова из str[i] сразу сдвигаем на l в предыдущее выбранное из str[i-1] слово и сравниваем с s[k]. В этом цикле у нас 1 выборка, 1 сдвиг и 1 сравнение на каждое слово из искомой строки. Вместо 6 выборок и 6 сравнений для байтовых операций.
Как только доходим до конечного слова в искомой строке, вместо выборки следующего слова из str, вдвигаем в str[i-1] на l*8 просто 0. Сравниваем. Если успех - выходим, строка нашлась, если неудача - продолжаем основной цикл.
Чем больше у нас искомая строка и больше исходный текст, тем ближе мы к отношению (6 выборок+6 сравнений) против (1 выборка, 1 сдвиг и 1 сравнение).
То есть, второй случай (с большими строками) выгоднее. Описывать не буду - суть та же.
Если искомая строка невыравнена на слово - просто добавится такая же (с инициализацией нулём в начале цикла, вместо первого чтения) обработка первого слова, как и у последнего.
Ну и СОХРБ добавить в систему команд - дело плёвое.
Татарин>> Не нужно. Но можно.
3-62> Если припрет. Но в целом, нонешнее быстродейтствие для пользователя делает незаметными "потери на байтовую неоптимальность".
Ну, и да... и как бы нет... Собссно, всё быстродействие машины и складывается из оптимальностей/неоптимальностей.
Вопрос-то в другом: а, собссно,
что мы за это получили?
Железо, софт - это всегда компромиссы между чем-то и чем-то. Что-то жертвуется, что-то приобретается. Я никак не против байта, тут мысль-то другая: ну хорошо, вот наши жертвы, а где тот
профит, который мы на эти жертвы выменяли?
По факту имеем что? Мы имеем то, что на самом "байтовом" х86 (байтовее уже, казалось бы, и некуда) в таких самых супер-ориентированных на тексты программах как компиляторы или базы данных мы крайне редко используем байтовые операции. Ну так и вопрос: ладно, в этой борьбе мы потеряли многое, но а за что мы боролись-то?