" title="Написать письмо">Написать письмо
На выжить после операций проктологии
2200 4002 2461 6363

Статистика

Пользователи : 1
Статьи : 2533
Просмотры материалов : 10956646
 
Ода #define (04.11.2026). Печать E-mail
2026 - Ноябрь
04.11.2026 14:21
Save & Share
Раньше - я смеялся над тупыми стажёрами. Теперь - можете посмеяться надо мной. Но, рано или поздно, - я посмеюсь над теми, кто смеялся надо мной. Эй, ржущий программист с зарплатой 700к! Я иду к тебе. С terminate define. Не знаешь ты его свойств до конца.


Занимаясь в кровати разработкой такого быстрого генератора хаотичных чисел, чтобы затмить им XORShift128+ и его создателя, - пришлось не просто новую парадигму работы с хаосом придумать. Пришлось пробовать самые разные способы ускорения работы исходного кода. До такой степени высокая скорость генерации на одном потоке 1.25ГГц, что даже один if внутри цикла сбивает скорость на 3%. Применялось всё: сраный ассемблер (на котором программировал в последний раз году в 2008), inline, register, static, __fastcall, побитовое И вместо % - в ход шло просто всё, что есть в голове, и чего в ней не было.

В процессе возни, внезапно выстрелило то, чем никогда не пользовался: define. Где бы он ни встречался - он использовался просто для создания имён переменных для констант, типа #define Vozrast 41 - ну и болт на него был забит. Потом, в процессе его изучения, выяснился баг: на старых языках программирования - его скорость настолько колоссальна, что затмила собой ассемблерные вставки. После этого, становится понятно: почему раньше использовали #define вместо тупо создания переменной в более удобном для неё месте: это быстрее. Но профит был получен совсем в другом.

Эта зараза - может содержать в своём теле процедуру со входными параметрами (что-то такое видел в BLAKE3 и SHA512, очень короткое, - но не придал тогда значения). Поместив в #define процедуру с изменением массива на определённое число - скорость улетела в скратосферу. Скорость генератора данных на текущий момент стала 3.36ГБ/с.

Прошло небольшое время - и приходит понимание, что эта дрянь умеет ещё и возвращать значения, - причём любым желаемым типом, хоть константу перетипируй. То есть, #define можно использовать как ультрабыструю функцию со входным параметром в роли выходного (просто "return" в виде "(__int8)26" - в старом Borland C++ Builder v.6.0 не работает) - но без возможности прямого дебага (плата за скорость).

Это дало возможность не весь массив разом изменять для создания хаоса - а выборочно, чтобы менялась половина массива (сейчас - меняются просто либо чётные, либо нечётные). В итоге, скорость генератора выросла ещё в 2 раза - не потеряв коэффициент хаотичности Шеннона 7.5 для участков мусора 2-200МБ, но потеряв средний коэффициент для блока 512Б с 6.29 до 5.85 (оставаясь в категории 5-6.8 "стандартный исполняемый код"). А хаотичность блока - можно повысить, создав десяток дефайнов с разными изменяемыми ячейками массива - но чтоб половина менялась. А, может, и половину в небольшой хаос превратить.

#define ldChange_LongDouble_Odd(ldArray, ldChanger_LongDouble, ui8Result) \
{ \
    (ldArray)[1] += (ldChanger_LongDouble); (ldArray)[3] += (ldChanger_LongDouble); (ldArray)[5] += (ldChanger_LongDouble); (ldArray)[7] += (ldChanger_LongDouble); (ldArray)[9] += (ldChanger_LongDouble); \
    (ldArray)[11] += (ldChanger_LongDouble); (ldArray)[13] += (ldChanger_LongDouble); (ldArray)[15] += (ldChanger_LongDouble); (ldArray)[17] += (ldChanger_LongDouble); (ldArray)[19] += (ldChanger_LongDouble); \
    (ldArray)[21] += (ldChanger_LongDouble); (ldArray)[23] += (ldChanger_LongDouble); (ldArray)[25] += (ldChanger_LongDouble); (ldArray)[27] += (ldChanger_LongDouble); (ldArray)[29] += (ldChanger_LongDouble); \
    (ldArray)[31] += (ldChanger_LongDouble); (ldArray)[33] += (ldChanger_LongDouble); (ldArray)[35] += (ldChanger_LongDouble); (ldArray)[37] += (ldChanger_LongDouble); (ldArray)[39] += (ldChanger_LongDouble); \
    (ldArray)[41] += (ldChanger_LongDouble); (ldArray)[43] += (ldChanger_LongDouble); (ldArray)[45] += (ldChanger_LongDouble); (ldArray)[47] += (ldChanger_LongDouble); (ldArray)[49] += (ldChanger_LongDouble); \
    (ldArray)[51] += (ldChanger_LongDouble); \
    ui8Result = 0; \
}

Итак, скорость генерации на текущий момент - 6.72ГБ/с. Для точного уделывания Себастьяно Виньи - осталось ускорить его в 4 раза. И это ещё с указателями для 2 переменных справа игр не было...

...как же гугл врёт во всём этом, а... С указателями - провал: скорость уменьшилась раз в 100. Он писал ещё, что сделать ldChanger_LongDouble флоатом - сильно замедлит; реальность: условная задержка 58.8мс/Б - стала 58.3мс/Б - почти 1% в скорости выигрыш получился. И ведь молодёжь принимает этот пиздёж от ИИ за чистую монету...

Оставил 2 define, перекрёстно поменял в них индексы, перемешав их бывшую чёткую логику в хаос, - оба коэффициента энтропии упали до 6.9 и 5.4. Но не буду исправлять назад: такое перемешивание - защита от человека, а не от машины: чтобы он не увидел закономерностей при подмене истинной информации на мусор.

...но, может быть, можно ещё быстрее?..

Обновлено ( 05.11.2026 15:49 )
 
 

Последние новости


©2008-2026. All Rights Reserved. Разработчик - " title="Сергей Белов">Сергей Белов. Материалы сайта предоставляются по принципу "как есть". Автор не несет никакой ответственности и не гарантирует отсутствие неправильных сведений и ошибок. Вся ответственность за использование материалов лежит полностью на читателях. Размещение материалов данного сайта на иных сайтах запрещено без указания активной ссылки на данный сайт-первоисточник (ГК РФ: ст.1259 п.1 + ст.1274 п.1-3).

Много статей не имеет срока устаревания. Есть смысл смотреть и 2011, и даже 2008 год. Политика сайта: написать статью, а потом обновлять ее много лет.
Рекламодателям! Перестаньте спамить мне на почту с предложениями о размещении рекламы на этом сайте. Я никогда спамером/рекламщиком не был и не буду!
Top.Mail.Ru