Forwarded from Метаверсище и ИИще (Sergey Tsyptsyn ️️)
Пост для гиков.
Если поглядеть на картинку (и тред), то маленькая иконка OpenAI указывает на то, как GPT находит баги и эксплоиты в коде (тут конкретно в коде смартконтрактов). Они (пока) простые и достаточно распространенные, но то, как GPT их описывает жутко интересно. А также он декомпилирует байткод и описывает что он делает.
Это я к чему.
Если нужно будет захватить мир путем взлома человеческой инфраструктуры - то ИИ уже готов - дайте только доступ в интернет. И готовьте свои метамаски.
https://twitter.com/gf_256/status/1598104835848798208
Если поглядеть на картинку (и тред), то маленькая иконка OpenAI указывает на то, как GPT находит баги и эксплоиты в коде (тут конкретно в коде смартконтрактов). Они (пока) простые и достаточно распространенные, но то, как GPT их описывает жутко интересно. А также он декомпилирует байткод и описывает что он делает.
Это я к чему.
Если нужно будет захватить мир путем взлома человеческой инфраструктуры - то ИИ уже готов - дайте только доступ в интернет. И готовьте свои метамаски.
https://twitter.com/gf_256/status/1598104835848798208
X (formerly Twitter)
cts🌸 (@gf_256) on X
OMG WTF
👍6🔥4😱3🤔1😢1🤮1
commit -m "better"
Недавно рассказывал, что соорудил рендеринг #svg иконок в png, через #inkscape. Все же, мне этот процесс кажется не очень технологичным: * Inkscape - overkill по зависимостям * И, хотя я и сделал, что от пакета с иконками зависит только финальный #realm…
Мужик сказал - мужик сделал!
Запилил я gdk pixbuf #svg loader поверх #lunasvg!
В процессе, конечно, узнал много чего интересного, чем и спешу поделиться.
Короткая предыстория:
* Сперва у меня вообще не было рендера svg, потому что #rsvg перешел на Rust, а его у меня (пока?) нет.
* Потом я научился использовать довольно старую версию librsvg, которая была написана на C, и глючила, что пиздец - 1/4 иконок была отренжерена с какими-то артефактами. Это, конечно, то еще достижение, учитывая простоту формата svg.
* Потом я научился готовить для всех scalable иконок png заранее, с помощью inkscape. Примерно для 1/4 оставшихся использовался старый rsvg render, с баглом и артефактами.
* Потом я нашел замечательную #lunasvg, и перешел на нее для рендеринга png, а то, что мой процесс не находил, или были нужны какие-то особенные разрешения, использовался старый rsvg.
* (мы находимся тут) -> png рендерятся с помощью lunasvg, остатки - тоже.
https://github.com/pg83/ix/blob/main/pkgs/lib/lunasvg/gdk/io.cpp - вот код клея между lunasvg и gdk-pixbuf.
БОльшую часть кода я написал за полчаса, а потом еще часа 3 трахался за последние 5 строк кода, без которых на экране был мусор:
* Примерно полтора часа - это "нормальная" отладка - разбирательство с тем, в каком формате поверхность отдает lunasvg, в каком ожидает GdkPixbuf, и как их "поженить", разбирательство с моделью владения памятью в glib(чтобы не текло и не ездило по use-after-free), и с обработкой ошибок в ней же.
* А вторые полтора часа - это какая-то совершенно безумная ебала, когда, на первый взгляд, я делаю все правильно, при этом, знаю, что command line часть lunasvg родила корректный png, но, если отрендерить его в динамике моим кодом, то на экране - мусор.
В какой-то момент времени я остановился, и подумал: "А какое бы безумное действие я мог бы совершить на месте авторов gtk, чтобы у меня ничего не работало"?
Единственное, что мне пришло в голову - что они, зачем-то, портят xml с svg, перед тем, как его передать мне. Ну потому что как еще объяснить факт, что pixmap data получается разная?
Sooka! Sooka! Аааа!
https://github.com/GNOME/gtk/blob/main/gtk/gdkpixbufutils.c#L249
Короче, они манглят svg во вложенный svg в виде base64 блоба. КМК, это сделано затем, чтобы указать уникальный размер для рендеринга. Да, да, в scalable vector graphics есть width, и height, чтобы им пусто было.
Я, конечно, решил, что раз эти негодяи формируют xml через printf, то парсить я его буду регулярками. https://github.com/pg83/ix/blob/main/pkgs/lib/lunasvg/gdk/io.cpp#L93 (да, да, это точно надо занести в upstream)
После этого почти(в следующей серии!) все заработало, иконки выглядят очень хорошо, всяко лучше, чем в бажной и глючной старой librsvg.
Запилил я gdk pixbuf #svg loader поверх #lunasvg!
В процессе, конечно, узнал много чего интересного, чем и спешу поделиться.
Короткая предыстория:
* Сперва у меня вообще не было рендера svg, потому что #rsvg перешел на Rust, а его у меня (пока?) нет.
* Потом я научился использовать довольно старую версию librsvg, которая была написана на C, и глючила, что пиздец - 1/4 иконок была отренжерена с какими-то артефактами. Это, конечно, то еще достижение, учитывая простоту формата svg.
* Потом я научился готовить для всех scalable иконок png заранее, с помощью inkscape. Примерно для 1/4 оставшихся использовался старый rsvg render, с баглом и артефактами.
* Потом я нашел замечательную #lunasvg, и перешел на нее для рендеринга png, а то, что мой процесс не находил, или были нужны какие-то особенные разрешения, использовался старый rsvg.
* (мы находимся тут) -> png рендерятся с помощью lunasvg, остатки - тоже.
https://github.com/pg83/ix/blob/main/pkgs/lib/lunasvg/gdk/io.cpp - вот код клея между lunasvg и gdk-pixbuf.
БОльшую часть кода я написал за полчаса, а потом еще часа 3 трахался за последние 5 строк кода, без которых на экране был мусор:
* Примерно полтора часа - это "нормальная" отладка - разбирательство с тем, в каком формате поверхность отдает lunasvg, в каком ожидает GdkPixbuf, и как их "поженить", разбирательство с моделью владения памятью в glib(чтобы не текло и не ездило по use-after-free), и с обработкой ошибок в ней же.
* А вторые полтора часа - это какая-то совершенно безумная ебала, когда, на первый взгляд, я делаю все правильно, при этом, знаю, что command line часть lunasvg родила корректный png, но, если отрендерить его в динамике моим кодом, то на экране - мусор.
В какой-то момент времени я остановился, и подумал: "А какое бы безумное действие я мог бы совершить на месте авторов gtk, чтобы у меня ничего не работало"?
Единственное, что мне пришло в голову - что они, зачем-то, портят xml с svg, перед тем, как его передать мне. Ну потому что как еще объяснить факт, что pixmap data получается разная?
Sooka! Sooka! Аааа!
https://github.com/GNOME/gtk/blob/main/gtk/gdkpixbufutils.c#L249
Короче, они манглят svg во вложенный svg в виде base64 блоба. КМК, это сделано затем, чтобы указать уникальный размер для рендеринга. Да, да, в scalable vector graphics есть width, и height, чтобы им пусто было.
Я, конечно, решил, что раз эти негодяи формируют xml через printf, то парсить я его буду регулярками. https://github.com/pg83/ix/blob/main/pkgs/lib/lunasvg/gdk/io.cpp#L93 (да, да, это точно надо занести в upstream)
После этого почти(в следующей серии!) все заработало, иконки выглядят очень хорошо, всяко лучше, чем в бажной и глючной старой librsvg.
GitHub
ix/pkgs/lib/lunasvg/gdk/io.cpp at main · pg83/ix
ix package manager. Contribute to pg83/ix development by creating an account on GitHub.
👍10🔥6👌3😁2👏1
commit -m "better"
Мужик сказал - мужик сделал! Запилил я gdk pixbuf #svg loader поверх #lunasvg! В процессе, конечно, узнал много чего интересного, чем и спешу поделиться. Короткая предыстория: * Сперва у меня вообще не было рендера svg, потому что #rsvg перешел на Rust…
Продолжение истории про #lunasvg. #svg
Я закончил на том, что у меня часть иконок была отренжерена через lunasvg в процессе построения пакета с иконками, а часть(которая вне этого пакета) - в процессе работы приложения.
Проблема была в том, что иконки, отренжеренные в динамике, были не черные, а слегка желтоватые. С таким уклоном в сепию, как будто-то кто сблендил чутка желтого цвета на поверхность.
Причем я совершенно точно уверен, что цвета я отдал правильные, я вывел их на консоль, и сравнил с тем, что шло в сгенеренных png. Уклона в сепию в этих цветах не было.
Я бы тут хотел ткнуть вас куском кода из rsvg/cairo/gdk, который страдает такой херней, но я не сумел, там все слишком запутано.
Чего только стоят несовпадения ARGB/RGBA, где-то используется premultiplied alpha, где-то - нет, premultiplied alpha по разным формулам, все эти поверхности постоянно туда-сюда преобразуются.
Я решил просто потвикать r, g, b, a каналы в разные стороны, и посмотреть, что получится.
В процессе я выяснил:
* g, b каналы никак не использовались, ну, то есть, я мог туда записать все, что угодно.
* r канал давал изменение от цвета фона к ярко-желтому цвету. 0 - фон, 255 - ярко-желтый(нет, это не cmyk, и не прочие модели, по крайней мере, не те, что я знаю).
* alpha канал работал, как надо.
Мое лучшее предположение - что рендеринг symbolic иконки - это, собственно, отбрасывание r, g, b, и использование только alpha компоненты для блендинга между фоном и цветом для рисования.
Желтый? Хер его знает, может, для дебага, может, я вообще неверно все понял.
В итоге, решение вида "оставить только alpha канал для svg, которые загружаются как symbolic иконки", вполне себе сработало, я с лупой не нашел отличий. https://github.com/pg83/ix/blob/main/pkgs/lib/lunasvg/gdk/io.cpp#L100
Так-то это достаточно логично - а как еще наиболее дешево "оконтурить" произвольную svg?
Где это происходит в связке rsvg/gdk/cairo, я не нашел, они большие мастера прятать такое говнецо.
Я закончил на том, что у меня часть иконок была отренжерена через lunasvg в процессе построения пакета с иконками, а часть(которая вне этого пакета) - в процессе работы приложения.
Проблема была в том, что иконки, отренжеренные в динамике, были не черные, а слегка желтоватые. С таким уклоном в сепию, как будто-то кто сблендил чутка желтого цвета на поверхность.
Причем я совершенно точно уверен, что цвета я отдал правильные, я вывел их на консоль, и сравнил с тем, что шло в сгенеренных png. Уклона в сепию в этих цветах не было.
Я бы тут хотел ткнуть вас куском кода из rsvg/cairo/gdk, который страдает такой херней, но я не сумел, там все слишком запутано.
Чего только стоят несовпадения ARGB/RGBA, где-то используется premultiplied alpha, где-то - нет, premultiplied alpha по разным формулам, все эти поверхности постоянно туда-сюда преобразуются.
Я решил просто потвикать r, g, b, a каналы в разные стороны, и посмотреть, что получится.
В процессе я выяснил:
* g, b каналы никак не использовались, ну, то есть, я мог туда записать все, что угодно.
* r канал давал изменение от цвета фона к ярко-желтому цвету. 0 - фон, 255 - ярко-желтый(нет, это не cmyk, и не прочие модели, по крайней мере, не те, что я знаю).
* alpha канал работал, как надо.
Мое лучшее предположение - что рендеринг symbolic иконки - это, собственно, отбрасывание r, g, b, и использование только alpha компоненты для блендинга между фоном и цветом для рисования.
Желтый? Хер его знает, может, для дебага, может, я вообще неверно все понял.
В итоге, решение вида "оставить только alpha канал для svg, которые загружаются как symbolic иконки", вполне себе сработало, я с лупой не нашел отличий. https://github.com/pg83/ix/blob/main/pkgs/lib/lunasvg/gdk/io.cpp#L100
Так-то это достаточно логично - а как еще наиболее дешево "оконтурить" произвольную svg?
Где это происходит в связке rsvg/gdk/cairo, я не нашел, они большие мастера прятать такое говнецо.
GitHub
ix/pkgs/lib/lunasvg/gdk/io.cpp at main · pg83/ix
ix package manager. Contribute to pg83/ix development by creating an account on GitHub.
👍4🐳3❤2🔥2🌭1🍌1
Не помню, рассказывал про свое микросоревнование с самим собой, или нет, беглый поиск по каналу ничего такого не нашел, поэтому рассказываю, тем более, есть повод!
Просто писать код - скучно, это уже давно доведено до автоматизма.
Поэтому я, по крайней мере, для pet project, изобретаю какие-нибудь ограничения, которым дополнительно должен удовлетворять код.
В #ix такое ограничение - это размер ядра(интерпретация пакетов и подготовка графа) в байтах.
Причем жестить нельзя - например, нельзя для этого сокращать имена функций, методов, и так далее.
Нужно мне длинное название метода - значит, будет длинное название! https://github.com/pg83/ix/blob/main/core/package.py#L261
(Кстати, немного в сторону - я обнаружил, что, в разных языках, я соблюдайю разные принципы именования. Например, в python это "короткие имена переменных, длинные(очень) имена методов и функций". Потому что типов нет, и иначе грепать становится невозможно)
Основные источники профита:
* Вынос кода из ядра в шаблоны. Это, кстати, хорошо по многим причинам - чем больше информации в шаблонах, и меньше в ядре, тем точнее uid ноды меняется в зависимости от фактических изменений результата.
* Поиск дублирующегося "смысла" (например, в какой-то момент мне довольно сильно помогло сократить размер понимание, что #realm/env - это точно такая же нода, как и любой прочий пакет, и обрабатывать ее надо тем же кодом)
Довольно долго я держал планку в 40к, при этом добавляя новые фичи, потом, полгода, держался на 50к, но вот последние месяца 2 - 3 забрался за 51, и оно никак не ужималось.
Сегодня я отыграл до 49к, бесплатно добавил новую команду "let", и очень рад этому факту!
"let" - это такой аналог "mut", который не перемещает глобальную симлинку на свежеподготовленный realm/env. Эта команда полезна, когда хочется перед переключением системы на новый root, посмотреть, чего там в нем таки лежит.
(напомню, что, по сути, мой корень - это симлинка на вот такой read only realm)
Как я это ужал?
Я отрефакторил команды mut/let/run/build в фасады к одной простой функции, которая умеет подготовить набор realm для заданной командной строки:
* let - это просто вызов этой функции
* mut - это let + несколько вызовов os.symlink()
Дальше интереснее:
* build - это интерпретация заданного command line в контексте создания нового эфемерного realm.
* run - это build, в финале которого еще запускаем одну команду в свежесозданном окружении.
https://github.com/pg83/ix/blob/main/core/cmd_realm.py#L27 - собственно, вот эти 5 функций, которые позволили мне стереть 1.5k кода!
Просто писать код - скучно, это уже давно доведено до автоматизма.
Поэтому я, по крайней мере, для pet project, изобретаю какие-нибудь ограничения, которым дополнительно должен удовлетворять код.
В #ix такое ограничение - это размер ядра(интерпретация пакетов и подготовка графа) в байтах.
Причем жестить нельзя - например, нельзя для этого сокращать имена функций, методов, и так далее.
Нужно мне длинное название метода - значит, будет длинное название! https://github.com/pg83/ix/blob/main/core/package.py#L261
(Кстати, немного в сторону - я обнаружил, что, в разных языках, я соблюдайю разные принципы именования. Например, в python это "короткие имена переменных, длинные(очень) имена методов и функций". Потому что типов нет, и иначе грепать становится невозможно)
Основные источники профита:
* Вынос кода из ядра в шаблоны. Это, кстати, хорошо по многим причинам - чем больше информации в шаблонах, и меньше в ядре, тем точнее uid ноды меняется в зависимости от фактических изменений результата.
* Поиск дублирующегося "смысла" (например, в какой-то момент мне довольно сильно помогло сократить размер понимание, что #realm/env - это точно такая же нода, как и любой прочий пакет, и обрабатывать ее надо тем же кодом)
Довольно долго я держал планку в 40к, при этом добавляя новые фичи, потом, полгода, держался на 50к, но вот последние месяца 2 - 3 забрался за 51, и оно никак не ужималось.
Сегодня я отыграл до 49к, бесплатно добавил новую команду "let", и очень рад этому факту!
"let" - это такой аналог "mut", который не перемещает глобальную симлинку на свежеподготовленный realm/env. Эта команда полезна, когда хочется перед переключением системы на новый root, посмотреть, чего там в нем таки лежит.
(напомню, что, по сути, мой корень - это симлинка на вот такой read only realm)
Как я это ужал?
Я отрефакторил команды mut/let/run/build в фасады к одной простой функции, которая умеет подготовить набор realm для заданной командной строки:
* let - это просто вызов этой функции
* mut - это let + несколько вызовов os.symlink()
Дальше интереснее:
* build - это интерпретация заданного command line в контексте создания нового эфемерного realm.
* run - это build, в финале которого еще запускаем одну команду в свежесозданном окружении.
https://github.com/pg83/ix/blob/main/core/cmd_realm.py#L27 - собственно, вот эти 5 функций, которые позволили мне стереть 1.5k кода!
GitHub
ix/core/package.py at main · pg83/ix
ix package manager. Contribute to pg83/ix development by creating an account on GitHub.
🔥10😱6👍4😁1🤯1
https://github.com/scandum/rotate
Интересная подборка про разные способы "провернуть"(поменять левую и правую часть с сохранением порядка в каждой из частей) массив.
У меня, когда в таком возникает нужда, в голову всегда приходит один и тот же алгоритм, который по ссылке назвали "Triple Reversal Rotation".
Он IMHO довольно естественно приходит в голову, когда про это задумываешься, и я даже и не знал, что есть что-то еще.
В #ix даже как-то возникла такая задача, потому что я принял не очень верное решение, что "верхние(элементы списка) переопределяют нижних", то есть, список зависимостей
А это, на самом деле, хоть и выглядит "естественно" для человека, порождает необходимость вот так вот "повертеть" массивчики в нескольких местах.
Например, вот тут - https://github.com/pg83/ix/blob/main/core/realm.py#L72-L73
Или вот тут, но тут сложнее заметить - https://github.com/pg83/ix/blob/main/core/package.py#L56
Интересная подборка про разные способы "провернуть"(поменять левую и правую часть с сохранением порядка в каждой из частей) массив.
У меня, когда в таком возникает нужда, в голову всегда приходит один и тот же алгоритм, который по ссылке назвали "Triple Reversal Rotation".
Он IMHO довольно естественно приходит в голову, когда про это задумываешься, и я даже и не знал, что есть что-то еще.
В #ix даже как-то возникла такая задача, потому что я принял не очень верное решение, что "верхние(элементы списка) переопределяют нижних", то есть, список зависимостей
{% block deps %}
A
B
C
{% endblock %}
превратится в "-I A/include -I B/include ..."А это, на самом деле, хоть и выглядит "естественно" для человека, порождает необходимость вот так вот "повертеть" массивчики в нескольких местах.
Например, вот тут - https://github.com/pg83/ix/blob/main/core/realm.py#L72-L73
Или вот тут, но тут сложнее заметить - https://github.com/pg83/ix/blob/main/core/package.py#L56
GitHub
GitHub - scandum/rotate: A collection of array rotation algorithms.
A collection of array rotation algorithms. Contribute to scandum/rotate development by creating an account on GitHub.
👍4🤯3🔥2🤔1
https://github.com/RomanHotsiy/commitgpt
"Automatically generate commit messages using ChatGPT"
Это мы используем.
"Automatically generate commit messages using ChatGPT"
Это мы используем.
GitHub
GitHub - RomanHotsiy/commitgpt: Automatically generate commit messages using ChatGPT
Automatically generate commit messages using ChatGPT - RomanHotsiy/commitgpt
👍12🍌4😐3👎1
https://www.opennet.ru/opennews/art.shtml?num=58249
Пишут, что нового кода в Android на Rust становится больше, а на С(и, в меньшей степени, на С++) - меньше.
Это, конечно, очень хорошо.
Думаю, вы уже знаете мою точку зрения, что, с точки зрения безопасности, современный С++(с RAII, контейнерами, и санитайзерами), на практике не сильно опаснее Rust(хотя Rust, конечно, сильно более хайповее!), но вот писать новый системный код на С - так себе идея.
Если честно, то мне, конечно, жаль, что гонку с С выиграл не С++, но и так неплохо получается.
Пишут, что нового кода в Android на Rust становится больше, а на С(и, в меньшей степени, на С++) - меньше.
Это, конечно, очень хорошо.
Думаю, вы уже знаете мою точку зрения, что, с точки зрения безопасности, современный С++(с RAII, контейнерами, и санитайзерами), на практике не сильно опаснее Rust(хотя Rust, конечно, сильно более хайповее!), но вот писать новый системный код на С - так себе идея.
Если честно, то мне, конечно, жаль, что гонку с С выиграл не С++, но и так неплохо получается.
www.opennet.ru
Около 21% нового компилируемого кода в Android 13 написано на языке Rust
Инженеры из компании Google подвели первые итоги внедрения в платформу Android поддержки разработки на языке Rust. В Android 13 примерно 21% от добавленного нового компилируемого кода написано на Rust, а 79% на C/C++. В репозитории AOSP (Android Open Source…
👍14💯3🥰2💩2
https://www.opennet.ru/opennews/art.shtml?num=58256
И вторая забавная новость.
Чуваки не могут поддерживать проект, потому что чувак с доступами не выходит на связь и не отвечает на звонки.
"Услугами FossHost пользовались такие открытые проекты, как GNOME, KDE, GNU Guix, Xiph.Org, Rocky Linux, Debian, OpenIndiana, Armbian, BlackArch, Qubes, FreeCAD, IP Fire, ActivityPub (W3), Manjaro, Whonix, QEMU, Xfce, Xubuntu, Ubuntu DDE и Ubuntu Unity. "
Я, на самом деле, не очень понимаю, о каких именно услугах идет речь, но не могу не повторить свою мысль, что код и прочую инфру желательно держать у больших инфраструктурных провайдеров.
Для души можно держать копию и даже мастер на небольшом хостинге, но 1 копия, из которой люди строят реальные пакеты, должна быть на большом хостинге.
Чтобы 1 человек не мог взять все ключи, и не помахать ручкой на прощание.
И вторая забавная новость.
Чуваки не могут поддерживать проект, потому что чувак с доступами не выходит на связь и не отвечает на звонки.
"Услугами FossHost пользовались такие открытые проекты, как GNOME, KDE, GNU Guix, Xiph.Org, Rocky Linux, Debian, OpenIndiana, Armbian, BlackArch, Qubes, FreeCAD, IP Fire, ActivityPub (W3), Manjaro, Whonix, QEMU, Xfce, Xubuntu, Ubuntu DDE и Ubuntu Unity. "
Я, на самом деле, не очень понимаю, о каких именно услугах идет речь, но не могу не повторить свою мысль, что код и прочую инфру желательно держать у больших инфраструктурных провайдеров.
Для души можно держать копию и даже мастер на небольшом хостинге, но 1 копия, из которой люди строят реальные пакеты, должна быть на большом хостинге.
Чтобы 1 человек не мог взять все ключи, и не помахать ручкой на прощание.
www.opennet.ru
Хостинг свободных проектов Fosshost прекращает работу из-за недоступности директора
Участники проекта Fosshost, безвозмездно предоставляющего виртуальные серверы для свободных проектов, объявили о невозможности дальнейшего предоставления услуг и ожидании скорого отключения серверов компании. Проблемы в Fosshost вызваны тем, что Томас Марки…
👍4😁4🤡3😢1
commit -m "better"
https://www.opennet.ru/opennews/art.shtml?num=58249 Пишут, что нового кода в Android на Rust становится больше, а на С(и, в меньшей степени, на С++) - меньше. Это, конечно, очень хорошо. Думаю, вы уже знаете мою точку зрения, что, с точки зрения безопасности…
Вытащу из комментариев.
https://crates.io/crates/fake-static
Баг в компиляторе Rust(висит с 15 года), позволяющий, без применения unsafe, произвольно менять lifetime.
Рекомендуется не использовать в проде! В целом, я всем тоже советую не использовать SEGFAULT в проде, да.
https://crates.io/crates/fake-static
Баг в компиляторе Rust(висит с 15 года), позволяющий, без применения unsafe, произвольно менять lifetime.
Рекомендуется не использовать в проде! В целом, я всем тоже советую не использовать SEGFAULT в проде, да.
👍9😁7🤡5
https://daniel.haxx.se/blog/2022/12/06/faster-base64-in-curl/
Тут вот автор curl решил похвастаться, как он ускорил свою же реализацию base64, в xy раз(даже не процентов!).
С точки зрения perf инженегра, это все, конечно, очень слабо:
* Нужно было не велосипедить, а соревноваться со state of the art, хотя бы https://github.com/lemire/fastbase64, или turbo base64.
* Соревновался он с линейным поиском символа в массиве 64 символов - "const char *p = strchr(base64, *s);"
* Таблицы - это для бенчмарков, в цикле. В реальном коде на современных процессорах лучше обращения к памяти не использовать.
Ну и, в любом случае, нужно было сделать зависимость от быстрой внешней либы для тех, кому надо, и оставить сколь угодно медленный случай для всех остальных, потому что где curl, а где base64.
Тут вот автор curl решил похвастаться, как он ускорил свою же реализацию base64, в xy раз(даже не процентов!).
С точки зрения perf инжене
* Нужно было не велосипедить, а соревноваться со state of the art, хотя бы https://github.com/lemire/fastbase64, или turbo base64.
* Соревновался он с линейным поиском символа в массиве 64 символов - "const char *p = strchr(base64, *s);"
* Таблицы - это для бенчмарков, в цикле. В реальном коде на современных процессорах лучше обращения к памяти не использовать.
Ну и, в любом случае, нужно было сделать зависимость от быстрой внешней либы для тех, кому надо, и оставить сколь угодно медленный случай для всех остальных, потому что где curl, а где base64.
GitHub
GitHub - lemire/fastbase64: SIMD-accelerated base64 codecs
SIMD-accelerated base64 codecs. Contribute to lemire/fastbase64 development by creating an account on GitHub.
🤡11👍5😁3🍌1