- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
function test3()
{
const a = 10.5
switch (a)
{
case 10.5:
print("cool. 10.5");
break;
}
}
function test3()
{
switch ("kokoko")
{
case "kokoko":
print("pituh");
break;
}
}
ASD_77 05.05.2021 11:12 # 0
guest6 05.05.2021 11:20 # 0
ASD_77 05.05.2021 11:44 # 0
guest6 05.05.2021 11:58 # 0
ASD_77 05.05.2021 12:11 # 0
JloJle4Ka 05.05.2021 12:12 # 0
ASD_77 05.05.2021 14:10 # 0
Soul_re@ver 05.05.2021 14:11 # 0
gologub 05.05.2021 14:27 # 0
ASD_77 05.05.2021 14:34 # 0
ASD_77 05.05.2021 12:14 # +1
PolinaAksenova 05.05.2021 11:40 # +2
Причём оптимальным образом — сделает бинярный поиск по хэшам!
ASD_77 05.05.2021 11:41 # 0
ASD_77 05.05.2021 11:43 # 0
PolinaAksenova 05.05.2021 11:46 # 0
Soul_re@ver 05.05.2021 11:49 # 0
PolinaAksenova 05.05.2021 11:52 # +1
ASD_77 05.05.2021 13:45 # 0
PolinaAksenova 05.05.2021 13:47 # +2
j123123 05.05.2021 14:20 # 0
https://neerc.ifmo.ru/wiki/index.php?title=Идеальное_хеширование
j123123 05.05.2021 14:30 # 0
JloJle4Ka 05.05.2021 14:52 # 0
PolinaAksenova 05.05.2021 14:50 # 0
j123123 05.05.2021 15:22 # 0
j123123 05.05.2021 15:27 # 0
Одними констэспрами это не решить.
PolinaAksenova 05.05.2021 16:41 # 0
j123123 05.05.2021 17:00 # 0
Аллокаторы какие-то
Операторы delete какие-то
В сгенерированном коде из
ничего этого нет. Ни единого выделения на хипе. Где ваше хваленое "zero-cost abstraction"?
PolinaAksenova 05.05.2021 17:05 # 0
j123123 05.05.2021 17:06 # 0
PolinaAksenova 05.05.2021 17:11 # 0
, но тогда придётся бинярный поиск по хэшам вручную делать (в случае с обычным switch () {case} компилятор его сам делает).
j123123 05.05.2021 17:20 # 0
И чтоб из этого допустим switch-case код нагенерился, и количество пар ключ-значение произвольно.
PolinaAksenova 05.05.2021 18:09 # 0
j123123 05.05.2021 18:44 # 0
Тут не генерируется никакого switch.
Давай так. Забудь вообще про perfect hash.
В коде https://wandbox.org/permlink/A2SBKuw91OCYKXl1 есть конструкция
Вот я хочу просто сделать штуку, которая принимает через шаблонные параметры пары ключ-значение, и чтоб из этого в компилтайме генерировался код соотв. функции с такими-то свитчами. Я не хочу отдельно что-то описывать!
Где там конкретно конструкция switch - case в твоем примере?
PolinaAksenova 05.05.2021 19:13 # 0
> А компилятор умеет генерировать оптимальные хеши без коллизий, если заранее известы все возможные вариации?
Ответ — да, умеет. Теперь это нядо посыпать сахаром?
j123123 05.05.2021 19:17 # 0
Ну так... если не посыпать сахаром, с этим отлично справится кодогенерация, и никакие супер-пупер фичи крестов не требуются.
На констэкспрах, раз уж на то пошло, можно набросать собственный компилтайм-мини-компилятор который понабросает опкодов процессора куда-то, и потом это "куда-то" можно сделать в RX сегменте, кастануть в функцию и вызывать. Надо ли говорить, что такой подход не совсем адекватный?
PolinaAksenova 05.05.2021 19:21 # 0
Вопрос в другом: ты убедился, что constexpr-ушня может сгенерировать perfect hash?
j123123 05.05.2021 19:26 # 0
В крестах для генерации кода нужно шаблоноговно использовать, а это уже другая хуйня, которую констэкспрами не выразить.
PolinaAksenova 05.05.2021 19:44 # 0
https://gcc.godbolt.org/z/droEe4Yrs
Задачу прикручивания к этой фигне perfect hash'а и мутабельных лямбд оставляю ня тебя (*^‿^*)!
PolinaAksenova 05.05.2021 19:52 # 0
Что явня быстрее любых perfect hash'ей и бинярных поисков.
j123123 05.05.2021 20:14 # 0
И там проблемы с оптимизацией заметны, компилятор почему-то делает jne .L20 на метку для инструкции ret в самом конце, хотя инструкция ret и так есть на метке .L1 которая идет после инструкции jmp puts который управление не вернет, так что кусок кода
нафиг не нужен. Переход на метку .L20 можно заменить на переход на метку .L1
PolinaAksenova 05.05.2021 20:25 # 0
GCC и MSVC. Шланг ня может.
> jne .L20
Это всё равно холодный путь, так что никакого влияния ня перформанс ня окажет.
j123123 05.05.2021 20:17 # 0
Кроме того, начиная с какого-то там количества вариантов, подход с таблицей поиска оказывается лучше хрени с условями. И фиг его знает, что там компилятор понакомпилириует
PolinaAksenova 05.05.2021 20:28 # 0
То ли дело сишка!
https://gcc.godbolt.org/z/qq8vxvbze
Позорище!
j123123 05.05.2021 20:31 # 0
На сишке я вручную это запрограммирую(возможно даже в асмовставке), если оно окажется боттлнеком.
PolinaAksenova 05.05.2021 20:34 # 0
Имення так. Вообще, сишники — это те же джависты, только вместо get set hashcode equals пишут вручную вообще всё: от управления ресурсами до исключений через setjmp.
j123123 05.05.2021 20:35 # 0
И получается, чсх, быстрее и эффективнее, чем какая-то заумная крестометушня, которая работает не во всех компиляторах и требует последний стандарт.
PolinaAksenova 05.05.2021 20:38 # 0
[citation needed]
Пока что мы лишь увидели, как линейный поиск по заранее заданным строкам в крестах как тузик грелку порвал точня такой же линейный поиск по заранее заданным строкам в сишке.
j123123 05.05.2021 21:06 # 0
https://wandbox.org/permlink/hrNq6pmrUutcxCt5 - примитивная кодогенерация.
https://gcc.godbolt.org/z/3a631c6Yx - результат.
Сравни это с https://gcc.godbolt.org/z/aa6Eqeze5 по качеству машинного кода.
PolinaAksenova 05.05.2021 21:15 # 0
И сразу же получают оптимальный код.
https://gcc.godbolt.org
j123123 05.05.2021 21:24 # 0
j123123 05.05.2021 21:31 # 0
компилятор может сделать табличку поиска, т.е. попросту говоря массив из указателей на функции (или возможно на блоки кода), и в arr[1] будет присвоен указатель на функцию smth1(), в arr[2] будет присвоен указатель на функцию smth2() и так далее. И это будет быстрее хешей и бинарного поиска. Оптимизация хуиты в swich это вообще целая наука. Глупо надеяться на то, что можно сделать всё оптимально, используя какой-то там хэш
MAKAKA 05.05.2021 21:38 # 0
Но массив указателей это правда круто
PolinaAksenova 05.05.2021 21:33 # 0
MAKAKA 05.05.2021 20:34 # 0
ну так где свитч с бинароным поиском по хешу, а где 100500 strcmp
PolinaAksenova 05.05.2021 20:36 # 0
j123123 05.05.2021 20:40 # 0
PolinaAksenova 05.05.2021 20:42 # 0
guest6 05.05.2021 20:48 # 0
Можно, кстати, и не по хешам, а просто разбить слова на буковки, и сделать дерево по буковкам же
PolinaAksenova 05.05.2021 20:50 # 0
guest6 05.05.2021 20:57 # 0
PolinaAksenova 05.05.2021 21:00 # 0
PolinaAksenova 05.05.2021 20:58 # 0
У меня в реальном коде используется имення такой свитч. И да, компилятор действительня превращает его в бинярное дерево:
https://gcc.godbolt.org/z/9jzYYcvha
Проверки ня коллизии выкинуты для няглядности.
j123123 05.05.2021 20:26 # 0
j123123 05.05.2021 18:59 # 0
https://wasm.in/archive/pub/9/pic/p33.gif
Если крестовым говнометапрограммированием нельзя просто понабрасывать меток case в этот switch и дать компилятору делать свое дело, нужно как-то ручками нагенерировать кучу if() хреней оптимальным образом (занимаясь работой компилятора).
MAKAKA 05.05.2021 19:15 # 0
Нет уж, лучше руками написать свитч, и пусть ебется компилятор, ведь он умел это еще в 2002-м году.
Интересно другое: один свитч на 20 веточек получается оптимальнее, чем 20 ифэлсов.
bormand 05.05.2021 19:16 # 0
Потому что одна ошибка предсказания дешевле чем пять, лол.
MAKAKA 05.05.2021 19:21 # 0
Но замечание Криса в том, что если ты заранее знаешь все возможные варианты, то ты просто ложишь их в двоичное дерево, и потом можешь по ним скакать за логорифм.
Можно кстати посчитать от них хеши, и сделать хетаблицу.
j123123 05.05.2021 19:25 # 0
Иногда компиляторы могут 20 ифелсоф распознать как switch и заоптимизировать его по аналогичной схеме.
PolinaAksenova 05.05.2021 19:16 # 0
Это нязывается "бинарный поиск".
j123123 05.05.2021 19:23 # 0
https://konyakov.ru/pubs/books/kris-kaspersky-r_i_p/kris-kaspersky-27.pdf
> Балансировка логического дерева
> Учитывая, что x86 процессоры все три операции сравнения <, =, > совмещают в одной машинной команде, двоичное логическое дерево можно преобразовать в троичное,тогда новых гнезд для его балансировки добавлять не нужно. Простейший алгоритм, называемый методом отрезков,работает так: сортируем все числа по возрастанию и делимполучившийся отрезок пополам. Число, находящееся по-середине (в нашем случае это 11), объявляем вершинойдерева, а числа, расположенные слева от него, – его левы-ми ветвями и подветвями (в нашем случае это 0, 3, 4 и 7).Остальные числа (22, 96, 98, 666, 777) идут направо.
bormand 05.05.2021 19:26 # 0
Х.з., это точно хороший хак? Пруфы пирфоманса есть?
j123123 05.05.2021 19:32 # 0
Я думаю что это от процессора зависит сильно. Ну вообще можно побенчмаркать конечно.
Если какой-то 8-битный говноконтроллер без префетчей, там вполне норм будет
ASD_77 05.05.2021 17:15 # 0
PolinaAksenova 05.05.2021 17:20 # 0
MAKAKA 05.05.2021 17:19 # 0
PolinaAksenova 05.05.2021 17:21 # 0
MAKAKA 05.05.2021 17:24 # +1
о, бля, у вам там целый тредик про это
изхвини
PolinaAksenova 05.05.2021 17:25 # +1
MAKAKA 05.05.2021 17:32 # +1
вообще свищ по строкам -- штука не однозначная, в реальном мире у нее мало полезных кейсов (кроме разве что literal types в TS) и скриптушне
интересно, на кой черт ее завезли в джавы и C#?
ASD_77 05.05.2021 18:36 # +1
PolinaAksenova 05.05.2021 18:39 # 0
MAKAKA 05.05.2021 18:44 # +3
LM-хеш вычисляется следующим образом:
* Пароль пользователя приводится к верхнему регистру.
* Пароль дополняется нулями или обрезается до 14 байтов.
* Получившийся пароль разделяется на две части по 7 байтов.
* Эти значения используются для создания двух ключей DES, по одному для каждой 7-байтовой половинки, при этом 7 байтов рассматриваются как битовый поток и после каждых 7 битов вставляется ноль. Так создаются 64 бита, необходимые для ключа DES.
* Каждый из этих ключей используется для DES-шифрования ASCII-строки «KGS!@#$%», в результате получаются два 8-байтовых шифрованных значения.
* Данные шифрованные значения соединяются в 16-байтовое значение, являющееся LM-хешем.
bormand 05.05.2021 18:51 # +2
Как вообще можно было додуматься обрезать пароли? Почему бы честно не сказать юзеру, что его пароль слишком длинный?
MAKAKA 05.05.2021 18:58 # +1
В 1993-м году о безопасности даже в большом Интернете не думали (finger в inetd наружу торчал), а уж в опенспейсовых кубиках офисов и подавно.
CEHT9I6PbCKuu_nemyx 01.09.2021 20:38 # 0
Эти сервисы закрылись после того, как ими воспользовались спамеры. Удобня: раньше можно было брутить е-мейлы для спам-баз без отправки писем.
«Виста» 2006-го года шла со списком таких сервисов, хотя они уже не работали.
CEHT9I6PbCKuu_nemyx 01.09.2021 20:45 # +1
Задепрекейтили их только после того, как стало много NAT'ов.
Desktop 01.09.2021 20:48 # 0
CEHT9I6PbCKuu_nemyx 01.09.2021 20:50 # 0
Представляешь, какой был уровень доверия?
Desktop 01.09.2021 20:52 # +1
guest6 01.09.2021 20:48 # +1
Это зачем?
POP3 умел AUTH из коробки, а SMTP не умел.
Его туда завезли относительно недавно (точнее фреймворк SASL)
https://datatracker.ietf.org/doc/html/rfc4954
Как было публичным почтовикам разрещать пользователю посылку пписем?
Только через POP before SMTP.
За натом можно было помочь соседу, конечно.
Но всё таки легитимный юзер и сраный спамер редко сидят в одной локалке
CEHT9I6PbCKuu_nemyx 01.09.2021 20:53 # 0
CEHT9I6PbCKuu_nemyx 01.09.2021 20:56 # 0
CEHT9I6PbCKuu_nemyx 01.09.2021 21:01 # 0
3.14159265 01.09.2021 15:02 # 0
Soul_re@ver 05.05.2021 11:42 # +1
ASD_77 05.05.2021 11:55 # 0
3.14159265 01.09.2021 14:47 # +1
Запросто.
https://ideone.com/dB8clW
CEHT9I6PbCKuu_nemyx 01.09.2021 14:56 # +1
Затем оставшееся место добивают нулями.
3.14159265 01.09.2021 15:07 # +1
Как видим в компайл-тайме всё оптимизируется в константы
https://gcc.godbolt.org/z/7xPEabYYx
3.14159265 01.09.2021 16:23 # +2
Теперь работает на длинных строках, однако короткие по-прежнему оптимизируются в mov/cmp/je.
Также сделал SWITCH более «бейсиковским» и добавил поддержку break.
https://ideone.com/a4Ni8C
CEHT9I6PbCKuu_nemyx 01.09.2021 17:21 # 0
PolinaAksenova 01.09.2021 19:50 # +3
https://govnokod.ru/27392#comment625532
В той ветке даже решение с идеальным хэшированием есть <( ̄︶ ̄)>!
3.14159265 01.09.2021 19:55 # +3
Мы няк раз ждали девочек-волшебниц: Полиняшу и Бормандяшу.
3.14159265 01.09.2021 15:58 # 0
CEHT9I6PbCKuu_nemyx 01.09.2021 20:03 # +1
https://govnokod.ru/27287#comment617046
Мне кажется, я их видел на ГК несколько лет назад.
3.14159265 01.09.2021 20:05 # +2
https://govnokod.ru/27392#comment625532
Мне всё покоя не даёт случай, если в 64-битное сравение подсунут строку с мусором.
В остальном пример с strcmp работает замечательно, лучше хеша.
CEHT9I6PbCKuu_nemyx 01.09.2021 20:12 # 0
http://graphics.stanford.edu/~seander/bithacks.html
3.14159265 01.09.2021 20:18 # +1
Я хотел посчитать количество ведущих нулей и сравнить.
Но, во-первых, это непортабельность на big-endian.
Во-вторых, не поможет с "syoma\0\0z" == "syoma"
Хотя технически строки одинаковы.
Придётся при каждом неравенстве звать strcmp (прощай пирформанс).
Похоже без магии девочек-волшебниц мне ня обойтись