LINUX.ORG.RU

Ada 2.* - быстрая C++ библиотека для парсинга URL

 , , ,


1

1

31-го марта и 17-го апреля состоялись выпуски 2.0.0 и 2.1.0 быстрой библиотеки парсинга URL для языка C++ (стандарт C++17).

По утверждению одного из авторов, Ada является самым производительным парсером URL (из сравниваемых альтернатив):

  • на 50% быстрее Boost;
  • в 3 раза быстрее Servo;
  • в 6 раз быстрее cURL.

Проект примечателен тем, что используется в Node.js, начиная с версии 19.7.0. Это значительно увеличило производительность разбора URL в Node.js:

  • на 82% быстрее Bun;
  • в 3 раза быстрее Deno.

Список изменений:

  • удалена зависимость от библиотеки ICU; для чего была разработана вспомогательная библиотека idna, реализующая функции to_ascii и to_unicode;
  • в дополнение к структуре ada::url, и для уменьшения используемой памяти, была добавлена структура ada::url_aggregator;
  • оптимизирована обработка доменов;
  • оптимизированы функции parse(...);
  • обновлены тесты.

Проекты ada-url и лицензии:

Блоги авторов:

>>> Подробности

★★★★★

Проверено: hobbit ()
Последнее исправление: hobbit (всего исправлений: 4)

Даешь JS-фреймворк Fortran, FTP-клиент Pascal и IRC-сервер COBOL! А к ним в придачу – спам-фильтр LISP и офисный пакет APL.

Vidrele ★★★
()

Интересно, чем руководствовались авторы библиотеки, когда выбирали название

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

Это какая аццкая вебня должна быть чтобы упираться в парсинг URL?

WAF?

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

Это какая аццкая вебня должна быть чтобы упираться в парсинг URL?

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

annulen ★★★★★
()

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

hobbit ★★★★★
()
Последнее исправление: hobbit (всего исправлений: 1)

Ada является самым производительным парсером URL

Daniel Lemire, известный по работе над проектами simdjson

Дело раскрыто

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

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

rupert ★★★★★
()

Так, где оно у меня было… Вот примерно так (убрал длинные квалификаторы имён) я парсил заголовки запроса в своём embedded веб-сервере. А точнее в коде, сгенерированным этим сервером-фреймворком по списку заголовков запроса, которые нужны приложению:

switch (*s | 0x20) {
    case 'c': {
        s++;
        if ((*(const uint16_t*)s | 0x2020) != 0x6e6f) {   // "on"
            return ERROR;
        }
        s += 2;
        switch (*s | 0x20) {
            case 'n': {
                s++;
                if ((*(const uint32_t*)s | 0x20202020) != 0x69746365 || (*(const uint16_t*)(s + 4) | 0x2020) != 0x6e6f || (s[6] | 0x20) != ':') {   // "ection:"
                     return ERROR;
                }
                return CONNECTION;
            }
            case 't': {
                s++;
                if ((*(const uint32_t*)s | 0x20202020) != 0x2d746e65) {   // "ent-"
                    return ERROR;
                }
                s += 4;
                switch (*s | 0x20) {
                    case 'l': {
                        s++;
                        if ((*(const uint32_t*)s | 0x20202020) != 0x74676e65 || (*(const uint16_t*)(s + 4) | 0x2020) != 0x3a68) {   // "ength:"
                            return ERROR;
                        }
                        return CONTENT_LENGTH;
                    }
                    ...

Понятно, что это HTTP/1.1 (в HTTP/2 имена стандартных заголовков не текстовые), но пойнт в том, что парсер URL-ей генерировался точно такой же, по buildtime-маппингу URL-ей на хэндлеры.

Пусть кто-нибудь попробует переплюнуть. Ну разве что сейчас я бы ещё [[unlikely]] раскидал перед return ERROR.

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

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

Скорее, чтобы затруднить анализ текста на предмет спама. Грамотных доверчивых людей полно, и спамеру их отсекать незачем. Выявление лоха – это больше про уличные разводы.

Да и всегда ли спамят именно разводами? Могут и приличную контору рекламировать неприличными методами.

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

В попытках найти объяснение, нашёл только это: Logo needed.

Ada means «island» in Turkish. What do you think about a minimalistic island as an icon?

Go! Anything is better than nothing.

Похоже, соавтор и сам не в курсе. :)

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

Очень радует тем что названием alias’ит один древний недоязычок, как бы говоря что недоязычок совсем уже не нужен и название свободно.

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

Нет, Даниэль ворвался позже

Так почему оно быстрее ржавого в 6 раз и быстрее буста в 50 процентов? Тем, что остальные либы писали индусы на отшибись? Или там какие-то интересные техники задействованы?

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

быстрее ржавого в 6 раз

В три, но не важно.

Или там какие-то интересные техники задействованы?

Да.

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

А про макрос какой-то и сейчас не знаю.

Да самоделки, типа таких:

#define LIKELY(x) __builtin_expect(!!(x), 1)
#define UNLIKELY(x) __builtin_expect(!!(x), 0)
#define EXPECT(x, expected) __builtin_expect((x), (expected))
dataman ★★★★★
() автор топика
Ответ на: комментарий от dimgel

builtin там где аттрибут не поддерживается. Так код будет совместим со старыми компиляторами, мало ли, вдруг его захотят собрать на какую-нибудь древнюю консоль или какой-нибудь siemens tricore, тулчейн под которых застрял на gcc 4.x

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

Магические константы внутри кода - это сильно...

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

Очень радует тем что названием alias’ит один древний недоязычок, как бы говоря что недоязычок совсем уже не нужен и название свободно.

Посоны, срочно выкидываем Аду из Боинга и переводим всё на Электрон! На самом деле, этот «древний недоязычок» используется в тех местах, для которых он предназначен, – во встраиваемых системах реального времени с высокими требованиями к надежности.

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

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

А тут нет противоречия, и используется он там не из-за своих замечательных свойств, а из-за инертности этих ниш. Как кобол в финансах, например. Потому что какой-нибудь говённый контроллер авионики сертифицировать нужно 5 лет и 7 кругов ада, да и зачем если есть замечательно работающий контроллер из 80-х. При этом язык-то ни разу не безопасный, не удобный и не эффективный, и контроллер этот периодически крашится и всеми силами норовит уронить твой боинг со всеми тушками на голову других тушек, и спасает его от этого только принятое в авиации многократное дублирование. Нуачо, с дублированием можно и на электроне писать.

slovazap ★★★★★
()
double url_examples_bytes = []() -> double {
  size_t bytes{0};
  for (std::string& url_string : url_examples) {
    bytes += url_string.size();
  }
  return double(bytes);
}();

Теперь я не цэпэпэ, а джоэс нах… Хотя этому синстаксису уж пару лет, но все равно попса подрывает традиционные ценности. Мож новости писать не про узкоспециализированные либы, а про какие-нибудт фреймворки либо утилиты

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

Ты, вроде бы, всё по делу говоришь, но это уж очень похоже на выдумку:

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

Есть пруфы или примеры?

Vidrele ★★★
()

Спасибо @dataman за вечно крутые и интересные полезные сишные новости!

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

Пусть кто-нибудь попробует переплюнуть.

А вообще, переплюнуть можно: если длина всех парсящихся имён заголовков например >= 8 байт, то можно было сразу switch(*(uint64_t*)s| 0x20.....) делать. За буфером 8 байт нулевых для защиты от переполнения здесь тоже сработали бы. Ну да и пофиг.

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

Строгий формат - это, например, IP-пакет.

Ога. Особенно в части опций :D
Впрочем, все сетевое оборудование их обычно одним куском пропускает. Или не пропускает…

BydymTydym
()

Ada 2.* - быстрая C++ библиотека для парсинга URL

Зато следующий сможет гордо сказать - «В 10 раз быстрее АДА»)

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