Страница телеграм канала Sea++

sea_plus_plus logo

Sea++

1135 подписчиков

Interesting materials from C/C++, Python, Go, Linux world and more by @sabbakumov | Интересные материалы из мира C/C++, Python, Go, Linux и не только от @sabbakumov


Входит в категории: Технологии
27.11.2019 18:11
likely/unlikely English version: https://telegra.ph/likelyunlikely-11-27 Многие задают вопрос про последнюю статью: что это за атрибут [[unlikely]]? Этот атрибут взят из черновика стандарта C++20: https://en.cppreference.com/w/cpp/language/attributes/likely Он подсказывает компилятору, какая ветка условия или case в switch выражении выполняется чаще. На x86/x64 компилятор поместит likely-ветку в ассемблере сразу же после проверки условия, максимально утилизируя кэш инструкций процессора. Никакого статического предсказания перехода тут нет. Однако не удивлюсь, что в какой-нибудь архитектуре PowerPC найдется отдельная инструкция для подсказки предсказателю переходов. В компиляторах пока еще нет поддержки likely/unlikely атрибутов, но зато есть расширения: #define likely(x) __builtin_expect(!!(x), 1) #define unlikely(x) __builtin_expect(!!(x), 0) Пример (только Clang и GCC), где ожидаем, что IsValid() чаще будет возвращать true: bool IsValid(); int Bar(); int Baz(); int Foo() { if (likely(IsValid())) return Bar(); else return Baz(); } Ассемблер: Foo(): # @Foo() push rax call IsValid() test al, al je .LBB0_2 pop rax jmp Bar() # TAILCALL .LBB0_2: pop rax jmp Baz() # TAILCALL Пример, где ожидаем, что IsValid() чаще будет возвращать false: bool IsValid(); int Bar(); int Baz(); int Foo() { if (unlikely(IsValid())) return Bar(); else return Baz(); } Ассемблер: Foo(): # @Foo() push rax call IsValid() test al, al jne .LBB0_1 pop rax jmp Baz() # TAILCALL .LBB0_1: pop rax jmp Bar() # TAILCALL Можно заметить, что компилятор ставит сразу после проверки (команда test) соответствующую нашей подсказке ветку кода. Это потенциально может дать неплохое ускорение, если все правильно разметили (а ведь можно дать и неверную подсказку). Нужно еще иметь ввиду, что сейчас процессоры очень хорошо предсказывают ветвления, так что разницу можно особо и не заметить.
Читать

Обращаем внимание, что мы не несем ответственности за содержимое(content) того или иного канала размещенный на нашем сайте так как не мы являемся авторами этой информации и на сайте она размещается в автоматическом режиме


14.11.2019 19:11
Status macros English version: https://telegra.ph/Status-macros-11-14 В продолжение к предыдущему посту об удобном способе обработки ошибок в C++. В гугловых проектах используются специальные классы Status и StatusOr (см. ссылка на пост у нас которые возвращаются из методов, в которых может произойти ошибка, например Status WriteToFile(std::string_view content); или StatusOr ReadFromFile(); Обычным способом проверки является if: Status Write(std::string_view content) { Status status = WriteToFile(content); if (!status.ok()) return status; return Status::OK(); } StatusOr Read() { StatusOr content = ReadFromFile(); if (!content.ok()) return content.status(); return content.ValueOrDie(); } Но это громоздко. В основном, используются специальные макросы (https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/stubs/status_macros.h): Status Write(std::string_view content) { RETURN_IF_ERROR(WriteToFile(content)); return Status::OK(); } StatusOr Read() { std::string content; ASSIGN_OR_RETURN(content, ReadFromFile()); return content; } Макросы, в общем случае, не рекомендуется использовать в C++. Но тут, на мой взгляд, они вполне оправданы. К тому же в if внутри макроса можно поставить атрибут [[unlikely]] и получить прирост в производительности, а так пришлось бы в каждый if писать ее явно. В общем, в этом случае только польза.
Читать

Обращаем внимание, что мы не несем ответственности за содержимое(content) того или иного канала размещенный на нашем сайте так как не мы являемся авторами этой информации и на сайте она размещается в автоматическом режиме


28.10.2019 21:10
Try, Go, Try! English version: https://telegra.ph/Try-Go-Try-10-28 Некоторое время назад в среде Go появилось предложение о введении встроенной функции проверки ошибок try (https://go.googlesource.com/proposal/+/master/design/32437-try-builtin.md, https://habr.com/ru/post/472758/) за авторством Роберта Гризмера. Это нужно для устранения повторяющихся проверок if err != nil { return nil, err } о которых не говорил только ленивый. К слову, это уже не первое предложение ввести новые языковые конструкции для обработки ошибок. Уже были check и handle, о которых я уже писал (ссылка на пост у нас В новом предложении f := try(os.Open(filename)) будет развернуто компилятором в f, err := os.Open(filename) if err != nil { return nil, err } что весьма удобно. handle не прижился из-за того, что был очень сильно похож на уже имеющийся механизм defer. try будет реализован как встроенная функция. Во-первых, сделать ее обычной функцией не удастся, потому что нужно будет уметь выходить сразу из двух стек фреймов. Во-вторых, отказ от использования нового ключевого слова позволяет сохранить обратную совместимость с уже имеющимися парсерами Go. UPD: предложение все же было закрыто. Между прочим, C++ тоже не хватает, на мой взгляд, возможности выйти сразу из нескольких стек фреймов. Это проблему можно решить, к примеру, используя нестандартное расширение GCC и макросы: https://github.com/google/lmctfy/blob/master/util/errors.h#L229 И писать std::string s = RETURN_IF_ERROR(FunctionReturnsStatusOrString()); получая здесь практически все то же самое, что дает try в Go.
Читать

Обращаем внимание, что мы не несем ответственности за содержимое(content) того или иного канала размещенный на нашем сайте так как не мы являемся авторами этой информации и на сайте она размещается в автоматическом режиме


21.10.2019 05:10
Google Abseil Btree В C++ библиотеку Google Abseil https://github.com/abseil/abseil-cpp/tree/master/absl/container, о которой я уже писал (ссылка на пост у нас добавили четыре новых STL-like Btree контейнера: absl::btree_map, absl::btree_multimap, absl::btree_set и absl::btree_multiset. Данные хранятся в памяти, но под капотом алгоритм, который пришел из баз данных. Btree хранит несколько элементов в одном блоке памяти, что уменьшает количество аллокаций, а также за счет более эффективного использования кэша работает быстрее в большинстве случаев. Это практически -in замена std::map и std::set. Однако при вставке и удалении происходит инвалидация итераторов. Поэтому надо быть осторожным. English version: https://telegra.ph/Google-Abseil-Btree-10-20
Читать

Обращаем внимание, что мы не несем ответственности за содержимое(content) того или иного канала размещенный на нашем сайте так как не мы являемся авторами этой информации и на сайте она размещается в автоматическом режиме


Sea++
15.10.2019 10:10
Читать

Обращаем внимание, что мы не несем ответственности за содержимое(content) того или иного канала размещенный на нашем сайте так как не мы являемся авторами этой информации и на сайте она размещается в автоматическом режиме


Sea++
15.10.2019 10:10
https://t.me/sea_plus_plus_chat — официальный чат канала Sea++. Здесь можно обсудить заметки и пообщаться с другими подписчиками. https://t.me/sea_plus_plus_chat — official Sea++ channel chat. Here you can discuss notes and communicate with other subscribers.
Читать

Обращаем внимание, что мы не несем ответственности за содержимое(content) того или иного канала размещенный на нашем сайте так как не мы являемся авторами этой информации и на сайте она размещается в автоматическом режиме


15.10.2019 10:10
Rust в Amazon Rust заполучил еще одного спонсора, компанию Amazon: https://aws.amazon.com/jp/blogs/opensource/aws-sponsorship-of-the-rust-project/ Пишут, что Амазон использует Rust в критичных к производительности компонентах Lambda, EC2 и S3. Конечно, еще больше производительности можно было бы получить используя C++, что я покажу в одной из следующих заметок. Ставка на Rust сейчас — это вопрос долгосрочных инвестиций, когда фронтенд компилятора сможет наконец дотянуться до C++ и использовать всю имеющуюся информацию для оптимизации кода. English version: https://telegra.ph/Rust-at-Amazon-10-15
Читать

Обращаем внимание, что мы не несем ответственности за содержимое(content) того или иного канала размещенный на нашем сайте так как не мы являемся авторами этой информации и на сайте она размещается в автоматическом режиме


11.10.2019 12:10
CURL — это C Интересное рассуждение автора библиотеки libcurl Дэниела Стенберга на тему выбранного для проекта языка C https://daniel.haxx.se/blog/2017/03/27/curl-is-c/ Главная идея: проект использует стандарт C89 для совместимости практически со всеми ОС и устройствами, все знают этот язык, переписывание на Rust дало бы огромное количество багов, которых нет сейчас, новые баги перимущественно возникают из-за логических ошибок в коде, а не по причине небезопасности языка. Возможно, автоматические утилиты преобразования в unsafe Rust код помогли бы тут. English version: https://telegra.ph/CURL-is-C-10-11
Читать

Обращаем внимание, что мы не несем ответственности за содержимое(content) того или иного канала размещенный на нашем сайте так как не мы являемся авторами этой информации и на сайте она размещается в автоматическом режиме


Sea++
18.03.2019 11:03
Комментарии (comments)
Читать

Обращаем внимание, что мы не несем ответственности за содержимое(content) того или иного канала размещенный на нашем сайте так как не мы являемся авторами этой информации и на сайте она размещается в автоматическом режиме


18.03.2019 09:03
Pythonic C++ std::string s; s = 1; — Вау, C++, оказывается, как Python! Можно присваивать строке целые числа, — подумаете вы, увидев, что данный фрагмент кода компилируется без ошибок. И... Будете неправы. Все дело в объявлении оператора присваивания: string& string::operator=(char ch); которое приводит 1 в char. Так что никакой магии нет. И данный момент заставит вас подумать, почему же в код закралась ошибка. А если вы все-таки хотите подобное поведение как в Python, взгляните в сторону std::any https://en.cppreference.com/w/cpp/utility/any English version: https://telegra.ph/Pythonic-C-03-18
Читать

Обращаем внимание, что мы не несем ответственности за содержимое(content) того или иного канала размещенный на нашем сайте так как не мы являемся авторами этой информации и на сайте она размещается в автоматическом режиме


Sea++
17.10.2018 18:10
Мечтаешь стать хакером, но вузы такому не учат? Пройди бесплатно 5-дневный интенсив, напиши свой первый вирус на самом востребованном языке Java! А еще у нас есть куча призов для участников, главный из которых – сертификат на 30 000 рублей и бюджетное поступление на курс по Java-программированию с последующей стажировкой и трудоустройством. Дерзай! https://goo.gl/dszdS1
Читать

Обращаем внимание, что мы не несем ответственности за содержимое(content) того или иного канала размещенный на нашем сайте так как не мы являемся авторами этой информации и на сайте она размещается в автоматическом режиме


15.10.2018 09:10
RapidJSON English version: https://telegra.ph/RapidJSON-10-15 Если вам в своих программах на C++ нужна библиотека для работы с JSON, рекомендую попробовать RapidJSON: https://github.com/Tencent/rapidjson Эта header-only библиотека, пожалуй, одна из самых быстрых библиотек для сериализации/десериализации JSON. Поддерживает SAX и DOM парсинг, SSE, Unicode и in-place парсинг. Лицензия MIT.
Читать

Обращаем внимание, что мы не несем ответственности за содержимое(content) того или иного канала размещенный на нашем сайте так как не мы являемся авторами этой информации и на сайте она размещается в автоматическом режиме


Sea++
26.09.2018 18:09
Зачем тратить время на обработку строк, анализ метрик и формирования всего в единый отчет? В век нейросетей пора прекратить вручную перебирать тысячи ячеек в Excel и копировать формулы. Пройди курс «Python для автоматизации аналитики» и узнай все инструменты для автоматизации процессов, чтобы делать работу в считанные минуты. Первым 20 — скидка 25% Присоединяйся https://goo.gl/9WbwxP
Читать

Обращаем внимание, что мы не несем ответственности за содержимое(content) того или иного канала размещенный на нашем сайте так как не мы являемся авторами этой информации и на сайте она размещается в автоматическом режиме


26.09.2018 14:09
Технология Hibernate в Яндекс.Браузере English version: https://telegra.ph/Hibernate-Technology-in-YandexBrowser-09-26 Было ли у вас такое, что вы работаете в браузере, открываете кучу вкладок, ваш компьютер начинает тормозить, при переключении между вкладками вы видите, что страницы перезагружаются? Многие согласятся, что Chromium-based браузеры страдают этим. Но позвольте представить вашему вниманию доклад от одной из наших групп по разработке Яндекс.Браузера, а точнее группы разработки рендеринг-движка: https://habr.com/company/yandex/blog/423507/ Ребята создали технологию Hibernate, которая при нехватке памяти, выгружает неиспользуемые веб-страницы на диск в зашифрованном виде. Причем полностью сохраняется состояние Blink и V8! На самом деле, они написали Clang-плагин, который парсит исходники V8 и Blink и генерирует код сериализации и десериализации. Самое интересное, что все это происходило буквально на моих глазах (сижу рядом с одним из разработчиков Hibernate) и наслышан тем, что создатели V8 делают все что только можно в угоду производительности. Да уж, смотреть код V8 то еще удовольствие. Более подробно можно прочитать в статье.
Читать

Обращаем внимание, что мы не несем ответственности за содержимое(content) того или иного канала размещенный на нашем сайте так как не мы являемся авторами этой информации и на сайте она размещается в автоматическом режиме


Sea++
13.09.2018 12:09
Хотите стать профессиональным аналитиком и научиться анализировать данные? У Skillfactory есть курс “Python для анализа данных”. Преподаватель курса: Программист-аналитик Яндекс.Маркета Константин Башевой. Вы научитесь: 1. Уверенно использовать Python и Pandas для боевых задач аналитики 2. Объединять данные из разных источников, работать с большими файлами (30 Гб), проектировать системы сквозной аналитики для реальных проектов 3. Парсить веб-страницы, работать с открытыми API, подробно изучите работу с API Яндекса и Google 4. Автоматически обновлять отчеты. Сделаете Telegram бота, который будет следить за работоспособностью системы и сообщать о проблемах обновления данных. 5. Пройдете финальный экзамен и получите диплом. Получить полную программу курса можно по ссылке https://bit.ly/2xbHrzq
Читать

Обращаем внимание, что мы не несем ответственности за содержимое(content) того или иного канала размещенный на нашем сайте так как не мы являемся авторами этой информации и на сайте она размещается в автоматическом режиме