Татарин>> Я почему и оговорился насчёт синтетики:
3-62> Это вполне реальный случай. Даже распространенный.
3-62> Поиск по тексту, когда "ключевых слов" оказывается мало. И надо доуточнять.
3-62>
Поставь задачу явно. Сейчас посмотрим.
3-62> А если слово двойное - то команд уже 4.
3-62> Или придумывать специальную команду сравнения.
Не уверен, что понимаю ситуацию.
Три момента. Первый: как я уже сказал, на машине без явной байтовой обработки текстовые строки, скорее всего будут выровнены на слово (соотвественно, последнее слово дополнено нулями). В этом случае алгоритм сводится к банальному пословному сравнению. Если уж выравниваются на слово куда менее чувствительные арифметические данные и переменные, то начала строк (типично очень массивных структур) выровнять на границу слова совершенно естественно.
Второй: для компактно расположеных строк и символов нужна только дополнительная более сложная выборка из слова. Это внутрирегистровые операции, в то время как байтовая выборка из памяти - отдельная операция с памятью
на каждый байт. При этом только в начале строки ты сдвигаешь 8 раз (для 64-бит), далее ты уже знаешь сдвиг строки относительно границы слов и после выборки слова сдвигаешь его на эту фиксированную величину, имея одно сравнение+сдвиги(внутрирегистровые) вместо 8 отдельных выборок и сравнений. Это всё равно в разы быстрее, чем побайтно.
ДАЖЕ на идеально настроенном на побайтовые операции, имеющем побайтовую адресацию и весь набор байтовой арифметики х86/х64 тебе выгоднее сравнивать пословно. То есть, отсуствие байтовых операций - это НЕ НЕДОСТАТОК. Это, блин, скорее преимущество, потому что инфорсирует написание и применение более эффективного кода.
(Тут звучит гимн и развевается флаг программистов всех времён и народов со словами рефреном "Это не бага, это фича"
)
Третий: ну, для удобства побайтную выборку/сохранение можно и ввести в оборот. Я считаю такой подход в ещё-не-сформированном байтовом мире скорее ошибкой, но это можно сделать очень легко.
3-62> Так что в реальности не все так однозначно как в той области, которая вам привычна.
3-62> И где можно "просто вызвать процедуру".
Не могу сказать, что я прямо уж очень много писал на ассемблере и в кодах (а в последнее время вообще сплошь манагед языки), но, КМК, тут картину я более представляю. Она вполне себе однозначная.
Татарин>> проигрыш не столь велик, как кажется при "наивном" подходе
3-62> Пока что проигрыш идет от выборки из памяти. Что обусловлено "стандартом обвязки RAM от попроще". НЯП.
Не только. Если начало строки выровнено на слово, то сравнений просто пропорционально меньше.
3-62> Но лучше - подумать как реорганизовать рабкрин RAM. Чтобы проблема выравнивания не была так остра.
Не думаю. Практика показала и доказала, что в итоге это обходится дороже. Собссно, что доказывает вся практика строковых операций на х86 (который как изначально наследующий от 8-битного проца на байты вот заточен просто-таки предельно)? То, что ДАЖЕ В ТАКОМ проце эффективнее работать пословно.
Да, такие извращения в железе дают возможность программисту писать менее быстрый код, но встаёт вопрос: а нафига оно надо? за то ли мы боремся?
Татарин>> а вот взять слово и сдвинуть и сравнить по маске
3-62> Вы же такие действия не понимаете, не любите и не применяете?
Можно ли сесть голой жопой на ежа? Можно, в трёх случаях: если ёж бритый, если задница чужая и если так написано в ТЗ.
Изначально проектируя архитектуру в мире практически свободном от легаси я бы, конечно, предпочёл не привязываться к фиксированному размеру данных в 8 бит, а сделать упор на удобстве операций с произвольными размерами, изначально рассматривая слова как векторы размерности от 1 до (число разрядов). Это дало бы
существенные преимущества во множестве применений.
Но если мы считаем байт за данность,
как и необходимость невыровненных строк - ну, тогда можно и так. Не нужно. Но можно.