оптимизация условных выражений
отцы, объясните лучше, как это работает
разве там что-то непонятно?
Ничего не понимаю...
Там вычисляется прекрасное выражение (eax + 7efefeffh) ^ (eax ^ -1).
Жёппой чую - где-то ошибка. Потому что инструкция xor eax,-1 получается совершенно лишней.
mov eax,dword ptr [ecx] ; read 4 bytes
mov edx,7efefeffh
add edx,eax
xor eax,-1
xor eax,edx
add ecx,4
test eax,81010100h
je short main_loop
; found zero byte in the loop
Там вычисляется прекрасное выражение (eax + 7efefeffh) ^ (eax ^ -1).
Жёппой чую - где-то ошибка. Потому что инструкция xor eax,-1 получается совершенно лишней.
> разве там что-то непонятно?
Зачем в ядре strlen? Точнее он там вполне может быть, но какой смысл его оптимизировать? Он часто исполняется?
Зачем в ядре strlen? Точнее он там вполне может быть, но какой смысл его оптимизировать? Он часто исполняется?
это относилось к позитивному знанию, а не к метафизическому
> Жёппой чую - где-то ошибка.
ещё внешний цикл должен быть, т.к. старший бит eax при такой проверке игнорируется (но сохраняется в edx)
ещё внешний цикл должен быть, т.к. старший бит eax при такой проверке игнорируется (но сохраняется в edx)
отцы, объясните лучше, как это работаетЕще strchr через этот же трюк работает... Там все _не очень_ сложно

Хм. Внешнего цикла там по смыслу быть не должно. Разве что потом ещё выяснение конкретной длины остатка может быть, но вносить внутрь вычисления было бы совершенно неразумно.
Вообще смысл, кажется, такой: быстро-быстро проверить, нет ли в уинте нулевых байтов. Что-то очень похожее там делается. Я даже заметил один знакомый паттерн, когда попытался всё это расписать: "(al - 1) ^ al". Но блин, всё равно какая-то фигня непонятная. Залезть, что ли, в исходники...
Вообще смысл, кажется, такой: быстро-быстро проверить, нет ли в уинте нулевых байтов. Что-то очень похожее там делается. Я даже заметил один знакомый паттерн, когда попытался всё это расписать: "(al - 1) ^ al". Но блин, всё равно какая-то фигня непонятная. Залезть, что ли, в исходники...
> Хм. Внешнего цикла там по смыслу быть не должно
это же не паскаль.
strlen - пробегает всю строку, отсюда и цикл.
это же не паскаль.
strlen - пробегает всю строку, отсюда и цикл.
Дык вот он и есть, этот цикл. Поставь в начале main_loop: и получишь завершённый кусок кода.
Нетрудно убедиться, что наткнувшись например на 0x80010101, цикл завершится, но нулей тут нет.
Нетрудно убедиться, что ты грязно напиздел
mov edx,7efefeffh
add edx,eax ; edx = 80010101h + 7efefeffh = FF000000;
xor eax,-1 ; eax = 7ffefefe
xor eax,edx ; eax = 80fefefe
mov edx,7efefeffh
add edx,eax ; edx = 80010101h + 7efefeffh = FF000000;
xor eax,-1 ; eax = 7ffefefe
xor eax,edx ; eax = 80fefefe
а теперь test eax,81010100h сделай, долбоёба кусок
Ну это все от того, что в слове одного бита не хватает
А так у этого алгоритма бывают иногда ложные срабатывания, но если ими пренебречь
то реально не нужен внешний цикл...
А так у этого алгоритма бывают иногда ложные срабатывания, но если ими пренебречь
то реально не нужен внешний цикл...на каком-нибудь risc можно было бы бит переноса не затирать, тогда действительно не нужен
ой, я test с cmp перепутал =)
А откуда у тебя 93000 сообщений? Это ж анрыл.
Он читер.
Как и шаллер с патником.
---
...Я работаю...
Как и шаллер с патником.
---
...Я работаю...
в корне неправильный подход.
-Такую оптимизацию должен делать компилятор
-код должен быть понятным (легко читаемым). А если там какая-то побитовая херня поди потом догадайся, что это значит через год.
- Любая оптимизация обычно является заключительной стадией разработки. Выполнять оптимизацию по ходу разработки - пустая трата времени и сил.
(хоть явно и не сказано, когда автор предлагает заниматься преложенной оптимизацией, но косвенно можно сделать вывод что по ходу. Но оптимизация условных выражений - это бред. Оптимизировать нужно логику, а для этого нужно иметь продуманную архитектуру. А в конце искать узкие места и оптимизировать их)
Короче полный аут. Можно занести это в раздел - как не нужно программировать.
-Такую оптимизацию должен делать компилятор
-код должен быть понятным (легко читаемым). А если там какая-то побитовая херня поди потом догадайся, что это значит через год.
- Любая оптимизация обычно является заключительной стадией разработки. Выполнять оптимизацию по ходу разработки - пустая трата времени и сил.
(хоть явно и не сказано, когда автор предлагает заниматься преложенной оптимизацией, но косвенно можно сделать вывод что по ходу. Но оптимизация условных выражений - это бред. Оптимизировать нужно логику, а для этого нужно иметь продуманную архитектуру. А в конце искать узкие места и оптимизировать их)
Короче полный аут. Можно занести это в раздел - как не нужно программировать.
очевидно, ты не в теме
твой поток сознания тут совсем не по делу
твой поток сознания тут совсем не по делу
Такую оптимизацию должен делать компиляторсогласен. но что делать, если он не делает? мы же живем в реальном мире
код должен быть понятным (легко читаемым). А если там какая-то побитовая херня поди потом догадайся, что это значит через год.для этого есть комментарии
но косвенно можно сделать вывод что по ходукаким образом?
Но оптимизация условных выражений - это бред.давно уже этим занимался, могу наврать. кажется, эти условные переходы крушат конвейерную систему проца, и прога может замедлиться в несколько раз
Такую оптимизацию должен делать компиляторВариантов много:
согласен. но что делать, если он не делает? мы же живем в реальном мире
1. найти правильный компилятор
2. найти правильную библиотеку
3. написать свою библиотеку (про написание своего компилятора не будем
)4. отказаться от оптимизации
А вообще Quercus прав
Любая оптимизация обычно является заключительной стадией разработки. Выполнять оптимизацию по ходу разработки - пустая трата времени и сил.Откуда возникает информация, что оптимизация вооюще нужна?
Когда у нас есть работающее приложение и мы можем тестировать его производительность, мы можем решить, устраивает ли она нас.
Если нет - вот тогда определяем самые критичные места и вперед.
При этом желательно, чтобы неоптимизированный вариант тоже оставался доступным (хотя бы для сравнения).
То есть разумно выносить функциональность, требующую оптимизации, в отдельную библиотеку. Тогда у нас в итоге получится 2 библиотеки: оптимизированная и неоптимизированная.
А оптимизация по ходу разработки лишь замедляет ее.
Да и самые значительные оптимизации как правило делаются на самом высоком уровне разработки.
для этого есть комментарииИх надо еще и писать. Более того, писать разумные комментарии.
То есть при прочих равных это все таки увеличивает вероятность ошибок.
А оно надо?
Нифига вы не понимаете!
Есть 2 типа программирование: "фундаментальное" и "прикладное".
Область ортимизации и прочие изъебства - это "фундаментализм"
Не надо путать написание софта коммерческого и софта ядреного.
Фундаментальное программирование иногда требуется при написании коммерческого софта, но не часто и только в узких областях и небольшом количестве мест.
Речь идет именно об этой узкой области, нечасто встречающихся задач.
В коммерческом софте такие задачи могут вставать только на конечном этапе разработки продукта и скорее всего даже уже после промышленного внедрения - в виде оптимизации готового. Хотя даже в таких случаях оптимизация скорее должна затрагивать вещи более высого уровня абстракции - оптимизация алгоритмов. Оптимизация же чисто процессорных инструкций с целью укорачивания, группирования и лучшей конвееризации в этом случае встречается крайне редко, если встречается вообще...
При написании некоммерческих ядреных вещей (фанаты юниха, привет!) об этом можно задумываться на самом начальном этапе, если известна четкая архитектура и платформа, на которой это планируется запускать.
Научные компьютерные расчеты в этом смысле близки к некомерческим ядреным.
Есть 2 типа программирование: "фундаментальное" и "прикладное".
Область ортимизации и прочие изъебства - это "фундаментализм"

Не надо путать написание софта коммерческого и софта ядреного.
Фундаментальное программирование иногда требуется при написании коммерческого софта, но не часто и только в узких областях и небольшом количестве мест.
Речь идет именно об этой узкой области, нечасто встречающихся задач.
В коммерческом софте такие задачи могут вставать только на конечном этапе разработки продукта и скорее всего даже уже после промышленного внедрения - в виде оптимизации готового. Хотя даже в таких случаях оптимизация скорее должна затрагивать вещи более высого уровня абстракции - оптимизация алгоритмов. Оптимизация же чисто процессорных инструкций с целью укорачивания, группирования и лучшей конвееризации в этом случае встречается крайне редко, если встречается вообще...
При написании некоммерческих ядреных вещей (фанаты юниха, привет!) об этом можно задумываться на самом начальном этапе, если известна четкая архитектура и платформа, на которой это планируется запускать.
Научные компьютерные расчеты в этом смысле близки к некомерческим ядреным.
Опять причина путается со следствием.
Изначальная постановка задачи: "оптимизация необходима. как её делать?", поэтому возражения типа "нафига" к данному вопросу никакого отношения не имеют. Кроме оптимизации бывают ещё дополнительные требования к коду, особенно на всяких недопроцессорах, выполнения которых от компилятора добиться очень сложно.
Изначальная постановка задачи: "оптимизация необходима. как её делать?", поэтому возражения типа "нафига" к данному вопросу никакого отношения не имеют. Кроме оптимизации бывают ещё дополнительные требования к коду, особенно на всяких недопроцессорах, выполнения которых от компилятора добиться очень сложно.
...Пальцы в рот да весёлый свист.
Для поддержания своей славы приведу выдержку:
"Don't decide, calculate."
Leo Brodie, "Thinking Forth," chapter 8, "Minimizing Control Structures."
---
"Расширь своё сознание!"
При написании некоммерческих ядреных вещей (фанаты юниха, привет!) об этом можно задумываться на самом начальном этапеВот уж в корне не согласен. Ни разу не видел чтобы бесплатное программирование "ради славы" шло по пути "фундаментального". Как раз в некомерческих проектах либо участники достаточно компетентны, чтобы понимать, что "оптимизациай потом займется кто-нибудь другой, а сейчас главное пропихать гениальную идею в массы". Либо они недостаточно компетентны для этого, тогда и говорить не о чем.
Ключевое слово (которое ты успешно пропустил мимо глаз)
> ядреных
---
...Я работаю...
> ядреных
---
...Я работаю...
Бесплатное программирование происходит вовсе не "ради славы".
Разве?
Ну давай кидай примеры ядерных бесплатных разработок, будем фтыкать в нереальные оптимизации... 

Опен-сорс?
Да пожалуйста --- например, ядра бзди, линукса и соляры.
---
...Я работаю...
Да пожалуйста --- например, ядра бзди, линукса и соляры.
---
...Я работаю...
> Ну давай кидай примеры ядерных бесплатных разработок, будем фтыкать в нереальные оптимизации...
Посмотри как вычисляется IP/TCP контрольная сумма в BSD системах.
Посмотри как вычисляется IP/TCP контрольная сумма в BSD системах.
Оставить комментарий
Ivan8209
В последнее время стали часто появляться вопросы,как заменить условное исполнение арифметическими и логическими действиями.
Показываю, как работать с арифметическим сравнением на примере 8086.
Процессор выбран как наиболее хорошо знакомый участникам форума.
Сравнение двух чисел A<B можно производить так,
чтобы получать определённую пару значений:
а) 0 и 1 --- как в Си;
б) 0 и "все разряды взведены" --- как в приплюснутом си.
Пример:
Хитрость заключается в следующем:
кроме обычных сложения и вычитания существуют ещё
"сложение с переносом" и "вычитание с заёмом",
учитывающие состояние разряда переноса.
Все разновидности сложений и вычитаний изменяют разряд переноса.
Сравнение с нулём, которое "!A" в Си, выполняется почти точно так же:
Все остальные виды извращений, как то получение "-1"
в качестве истины или зануление второго регистра,
остаются в качестве домашнего задания.
Некоторые процессоры поддерживают условное исполнение
не только переходов (ветвлений но и других действий,
например, пересылку данных.
Некоторые процессоры поддерживают условное исполнение чего угодно.
---
"Расширь своё сознание!"