LINUX.ORG.RU

Объясните сишную магию v2

 ,


2

4

В продолжение темы: Объясните сишную магию

Ковыряю сорцы Skia и наткнулся на такой забавный ужас (ссылка):

int fLastMoveToIndex = 5; // любое число
fLastMoveToIndex ^= ~fLastMoveToIndex >> (8 * sizeof(fLastMoveToIndex) - 1);

Экспериментально удалось выяснить, что данный код меняет знак и отнимает 1 только если число положительное. Как он это делает - я даже знать не хочу.

Вопрос: что мешало написать банальный if, или хотя бы оставить комментарий? Типичное сишное какерство?

PS: производительно данного куска кода на погоду не влияет.

★★★★★

Ответ на: комментарий от anonymous

т.е. ты хочешь сказать, что это не типичная оптимизация ветвления, а кто-то сконпелировал, дизасемблировал, а потом переписал в эквивалентный код на с++, заодно заменив 31 на 4 * sizeof(fLastMoveToIndex) - 1?

сильное заявление. но я думаю, что такой мозг рака возможен только в русте и по себе людей судить не надо. ну это типа как по непонятному коду делать вывод, что там делается изменение знака и вычитание единицы. так и тут, типа сдвиг какой-то, ксор откуда-то взялся. ну давай теперь вставим этот код везде и посмотрим что получится.

обрати внимание, что msvc эту оптимизацию не делает, а делает честное ветвление.

anonymous
()
Ответ на: комментарий от anonymous

сконпелировал, дизасемблировал, а потом переписал в эквивалентный код на с++

Давно так делаю. Обычному человеку не имеет смысла конкурировать со спец. машинами в их специализации.

msvc эту оптимизацию не делает, а делает честное ветвление

Кому нужен этот блоб, тем более для генерации предсказуемого (оптимизированного) кода?

Вдобавок, хром собирается клангом.

anonymous
()
Ответ на: комментарий от anonymous

хммм. тот случай когда компилятор умнее программиста. это не очень хорошо, братюнь. рустом балуешься небось?

anonymous
()
Ответ на: комментарий от anonymous

хахаха. вот так вы и палитесь. смотри, ещё волосы на ладошках вырастут.

anonymous
()
Ответ на: комментарий от anonymous

Накой хрен здесь эта «оптимизация»?

Здесь нет никакой «оптимизации». Здесь обычное идеоматическое выражение, понятное с ходу любому программисту.

LamerOk ★★★★★
()
Ответ на: комментарий от LamerOk

Здесь обычное идеоматическое выражение, понятное с ходу любому программисту.

То есть ты утверждаешь, что ТС - не программист?

По мне вопросов нет: аноним не может быть программистом (по определению).

anonymous
()

Типичное сишное какерство?

Флакончик, наверное ты прав. Я на паскале сколько пишу, такого не видел. А пишу очень серьезно.

Владимир

anonymous
()
Ответ на: комментарий от timdorohin

Вот с этим я не соглашусь. Я не уверен что компиляторы достаточно умные чтоб развернуть if в парочку дешевых логических операций, а не в условный переход

Самое смешное то, что таки прошлый пример с «return buff[!!(uc & ~0xff) + !!(uc & ~(~0u >> 1))]» компилируется в условный переход. Это просто еще один пример, когда кодеры вместо написания кода занимаются какой-то херней.

byko3y ★★★★
()
Ответ на: комментарий от anonymous

они делают какие-то битовые операции и промахиваются мимо кеша когда возникает ветвление

Всего-то надо макакиляторы вместо компиляторов использовать. Код пишет макака. Скармливает его макакилятору. Тот генерит код обычный, который хавает средний яйцеголовый и компиль. Метапрог что-то подобное делает.

когда все нормальные люди соберутся вместе и убьют всех тупых ублюдков, настанет золотая эра компьютинга, надо только подождать

Проще железа закупить, чем нанимать яйцеголовых. Пара макак и мощный проц быстрее чем яйцеголовый и микроконтроллер.

kostyarin_ ★★
()
Ответ на: комментарий от kostyarin_

ты мне нравишься. а что ты думаешь, если миллион макак будут нажимать на случайные кнопки тысячу лет, то рано или поздно они напишут веб-браузер с лисой на логотипе?

anonymous
()
Ответ на: комментарий от anonymous

миллион макак будут нажимать на случайные кнопки тысячу лет, то рано или поздно они напишут веб-браузер с лисой на логотипе?

Генетическое программирование. «Генетическое» - от генетические алгоритмы. Программы пишутся, используя генетические алгоритмы. Это идеализированная модель корпоративного программирования - макаки пишут программу для максимизации удовольствия конечных выгодополучателей. Шутка.

anonymous
()
Ответ на: комментарий от peregrine

Просто тогда ему найдут замену и уволят под благовидным предлогом, а так на его место могут придти такие же битолюбы.

Dark_SavanT ★★★★★
()
Ответ на: комментарий от anonymous

Это идеализированная модель корпоративного программирования - макаки пишут программу для максимизации удовольствия конечных выгодополучателей.

Макак-кодинг по сути виртуальный паразит, который заражает людей для собственного размножения, не обращая внимание на то, принесёт ли это вред или пользу носителю. Схема заражения изложена ниже.

  1. Человек заражается макакством. Из-за интоксикации ему нравятся условные переходы и не нравятся битовые операции и те кто их делает.
  2. Человек заражает коллектив. Коллектив выпускает правила написания кода, запрещающие битовые операции.
  3. Коллектив заражает CI-инструменты и они определяют битовые операции как плохой код. Так, даже не заражённый человек будет видеть эти строки подсвеченными красным. И в итоге заражаться.

Цикл завершается. Далее, лид, опираясь на CI-инструменты, будет заражать вновь прибывших программистов, потенциально здоровых. И так по кругу. Всё только для жизни, эволюции и размножения паразита.

kostyarin_ ★★
()
Ответ на: комментарий от kostyarin_

Из-за интоксикации ему нравятся условные переходы и не нравятся битовые операции и те кто их делает.

В теории категорий есть двойственная категория. Это когда меняешь стрелки на обратные и получается такая же стройная обратная «теория», когда нравятся битовые операции и не условные переходы, и последующая интоксикация битовыми операциями.

anonymous
()
Ответ на: комментарий от anonymous

обрати внимание, что msvc эту оптимизацию не делает, а делает честное ветвление.

icc, кстати, тоже. Хотя казалось бы.

SkyMaverick ★★★★★
()
Ответ на: комментарий от SkyMaverick

делает честное ветвление.

icc, кстати, тоже. Хотя казалось бы.

Где там честное ветвление? Там условное выполнение операции (cmov), нет переходов.

anonymous
()

Объясните сишную магию

Как он это делает - я даже знать не хочу.

Да как так то! :D

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от anonymous

Ветвление - это явное изменение IP, или PC, или что там в документации вместо этого, из-за чего у некоторых процессоров большие проблемы.

anonymous
()

Вопрос: что мешало написать банальный if, или хотя бы оставить комментарий? Типичное сишное какерство?

Да. Генерируется абсолютно одинаковый код на clang:

https://gcc.godbolt.org/z/zYz6jT

fsb4000 ★★★★★
()
Ответ на: комментарий от anonymous

ну вот явный прыжок: https://godbolt.org/z/o3P5ca

хотя я не вижу большой разницы. я конечно не большой спец по набору инструкций авр, но мне представляется, что разница только в том, что в авр нет той же инструкции, что на х86.

anonymous
()
Ответ на: комментарий от anonymous

ну вот явный прыжок: https://godbolt.org/z/o3P5ca

Во-первых, ты сравниваешь разный код по логике. Зачем ты это делаешь?

авр

Во-вторых, при чем тут авр?

И еще, у авр есть проблемы с ветвлением? Хотя такие короткие прыжки не вызовут проблем даже у современных x86.

anonymous
()
Ответ на: комментарий от anonymous

чтобы тебя обмануть конечно же. https://godbolt.org/z/xPKq75 ты не мог сам исправить?

ну если не вызовут проблем, то можно уже выпить таблетки и успокоиться.

anonymous
()
Ответ на: комментарий от SkyMaverick

Но условие-то не убирает, как gcc/clang.

Чем отличается регистр флагов от любого другого регистра в плане (по)битовых операций, кроме экзотических названий для этих опреаций?

anonymous
()
Ответ на: комментарий от kostyarin_

Проще железа закупить, чем нанимать яйцеголовых. Пара макак и мощный проц быстрее чем яйцеголовый и микроконтроллер

Формулировка некорректная. Яйцеголовых можно было бы нанять, только где их найти? Так, чтобы «яйцеголовые» не наняли в итоге через два уровня субподряда индусов, или чтобы не платить «яйцеголовым» бешенные деньги за то, что они будут час в день работать, а просить как за полный рабочий день.

byko3y ★★★★
()

^= ~

И эти люди называют Perl write-only языком.

Nervous ★★★★★
()
Ответ на: комментарий от anonymous

И еще, у авр есть проблемы с ветвлением? Хотя такие короткие прыжки не вызовут проблем даже у современных x86.

У AVR нет предсказания ветвлений, нет кэшей, нет конвейера и вообще это примитивный проц, для него это всё не нужно

Harald ★★★★★
()
Последнее исправление: Harald (всего исправлений: 1)
Ответ на: комментарий от anonymous

хотя я не вижу большой разницы. я конечно не большой спец по набору инструкций авр, но мне представляется, что разница только в том, что в авр нет той же инструкции, что на х86.

наверное конпелятор соптимизировал в сторону уменьшения размера кода

Harald ★★★★★
()
Ответ на: комментарий от Harald

Подсказки из зала - засчитывается поражение знатокам что?где?когда?

anonymous
()
Ответ на: комментарий от Harald

наверное конпелятор соптимизировал в сторону уменьшения размера кода

gcc умеет оптимизировать по размеру кода. Насколько я понял, это больше похоже на оптимизации по количеству строк асм-кода (или что у gcc как промежуточное представление машинного кода)

anonymous
()
Ответ на: комментарий от anonymous

gcc НЕ умеет оптимизировать по размеру кода.

anonymous
()
Ответ на: комментарий от anonymous

Неважно, gcc оптимизирует количество инструкций, а у CISC инструкции имеют разный размер

anonymous
()
Ответ на: комментарий от anonymous

Кстати у clang -Os работает также «криво», как у gcc. Для нормальной оптимизации по размеру надо -Oz

anonymous
()
Ответ на: комментарий от fsb4000

на расте c if также собирается как и на С с clang:

Казалось бы при чем тут LLVM

anonymous
()
Ответ на: комментарий от fsb4000

мне кажется тут какое-то неопределённое поведение со знаковыми целыми.

anonymous
()

читай устройство конвеера процессора и программирование без ветвлений, есть хорошее видео на заморском по теме ссылка

AKonia ★★
()

Да, если это не в хотспоте, то это совершенно бессмысленное битовозюканье.

Miguel ★★★★★
()
Ответ на: комментарий от anonymous

Мне просто показалось интересным, что gcc/clang развернули в то, что руками описано кодером, а msvc/icc условие оставил, но оптимизировал через операции с флагами.

Что, впрочем, ещё раз подтверждает, что компилятор такие простые условия как-нибудь и сам развернёт, без битолюбства.

SkyMaverick ★★★★★
()
Ответ на: комментарий от SkyMaverick

msvc/icc условие оставил, но оптимизировал через операции с флагами.

При этом я уверен, что код icc более тормозной. Вот такие вот оптимизаторы от производителя

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.