Как стать автором
Обновить
90
0
Александр Слесарев @nuald

Техлид, Cisco Meraki

Отправить сообщение

Не будет, компиляторы достаточно свободно меняют порядок кода внутри. GCC использует собственные эвристики: https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html#index-fno-guess-branch-probability Rust тоже реорганизует код, не могу найти официальную документацию, но вот тут небольшая дискуссия: https://users.rust-lang.org/t/how-to-keep-pattern-match-branch-order/66363

В общем случае, лучше не делать выводов по порядку исполнения кода по тексту на высокоуровневом языке программирования (и Си - это высокоуровневый, низкоуровневый - это ассемблер или LLVM IR). Более того, даже машинный код может выполняться не по порядку из-за out-of-order execution (и это причина для memory ordering у атомиков).

Это оффтопик, и я точно признаю, что на Go иногда приятнее и быстрее писать, но есть нюансы, которые меня от него в свое время оттолкнули, и возвращаться к нему без необходимости я бы не стал (но приходится):

  • до generic, повсеместное использование interface{} . Новый тип данных, но старый алгоритм - либо copy-paste, либо interface{}.

  • работа с модулями конечно стала удобнее, но все-равно не так удобно, как в том же Rust. `go mod vendor`, `go mod tidy` и т.д., все это не выглядит удобно по сравнению с другими системами.

  • goroutine не 100% безопасны, у нас были и leak-и и другие проблемы с ними.

  • неконтролируемый GC, проседания производительности на ровном месте, особенно если интенсивная работа с памятью.

  • большие бинарники (если статическая сборка). Правда Rust тоже не отстает, но его бинарники можно оптимизировать.

Но переписывать на Rust я бы 100% не убеждал. Мне в свое время зашел Zig, но там документация и сам проект достаточно сильно хромает, тоже нельзя рекомендовать. Плюс, есть CGo, который покрывает решения, где чистый Go может иметь проблемы.

Позвольте еще немного добавить, т.к. немного покопал этот вопрос в ARM. Они поддерживают разные предикторы, и не все эффективно работают: https://developer.arm.com/documentation/100965/1120/Timing-Annotation/Timing-annotation-tutorial/Modeling-branch-prediction/Impact-of-branch-misprediction-on-simulation-time Думаю, выбор предиктора влияет на электопотребление, так что не всегда можно рассчитывать, что будет хороший предиктор.

И небольшое уточнение по прошлому посту. eventfd_read - это плохой пример, т.к. это тяжелый syscall, и branch misprediction на его фоне не будет так важен. Но в целом для горячего пути, особенно если много ветвлений и/или медленный/устаревший процессор, это может пригодится.

Не все процессоры одинаково хороши, есть и ARM-ы. И этот хинт не для процессора, а компилятора, чтобы он поменял блоки и применил другие оптимизации, чтобы был лучше fall-through rate (т.е. более вероятные блоки кода вверху, безо всяких goto/jmp). И даже у Intel могут быть проблемы (Intel® 64 and IA-32 Architectures Optimization Reference Manual Volume 1):

Since only one taken (non-fall-through) target can be stored in the BTB, indirect
branches with multiple taken targets may have lower prediction rates.

PGO не особо подходит для сложных систем или сложен к использованию (например, для прошивок). Ну а применения:

  • логгирование и трассировка, которые включаются в ран-тайм, нам никогда не нужно чтобы они были в приоритете;

  • маловероятные ошибки (например, eventfd_read в горячем коде);

  • маловероятные внутренние состояния подсистемы.

И да, это не нужно абсолютному большинству программистов, но есть те, кому это нужно. В ядре Линукс:

$ grep --include "*.c" -rni "unlikely(" ./ | wc -l
19878

Не могу не добавить некоторые пункты про Раст, которые не позволяют ему заменить Си (пока, надеюсь, что со временем исправят). Конечно, надо отметить, что сам стандарт Си не все покрывает, что-то есть в C++, но тоже не все, и некоторые вещи работают только с gcc/clang extension:

  • отсутствие likely в stable (https://internals.rust-lang.org/t/could-unlikely-and-likely-be-stabilized-in-std-hint/9795?u=lzutao). Уже пять лет, а воз и ныне там. Официальный способ - #[cold], но это не покрывыет все потребности. Нужно для избежания branch misprediction.

  • alignment на уровне полей структур. В принципе не критично, т.к. можно разбить на подструктуры, но это может поломать совместимость с Си. Нужно для эффективного использования CPU cacheline.

  • Нефиксированный порядок полей в структурах. Можно считать как плюсом, так и минусом (Rust может более эффективно упаковать поля в структуре), но для высокоэффективного кода приходится применять соответствующие аттрибуты, чтобы это отключить. Опять-таки не критично, но нужно знать.

  • Отсутствие некоторых высокопроизводительных функций в std, например rint (https://en.cppreference.com/w/c/numeric/math/rint). С другой стороны, `to_int_unchecked` использует LLVM’s fptoui/fptosi (https://doc.rust-lang.org/std/intrinsics/fn.float_to_int_unchecked.html), так что это может быть не проблема.

Опять-таки, это нужно для очень высокопроизводительного кода, когда идет счет на такты процессора, для абсолютного большинства программистов это не нужно. И Раст в этом плане не так уж плох, тем более есть использовать nightly, в котором есть все что надо.

Вопрос библиотек тоже стоит, например, использовать uring_io несколько проблематично. tokio_rs добавляет кучу абстракций, которые реально замедляют код (опять-таки, для большинства будет нормально, я ссылаюсь на ситуации когда нужны гигабиты в секунду). moniui более или менее нормально, но сыроват. А напрямую binding-и писать занимает время.

У серверных процессоров (по крайней мере Intel) есть ещё одно преимущество - у них обычно расширенный набор инструкций (например, AVX512). Для некоторых применений (числодробилки, которые так просто не перенести на GPU) это бывает весьма полезно.

Искренне рад, что вам нравится в Ванкувере и все хорошо сложилось. Немного печально что Gastown так попортился, в свое время мы там часто тусовались. Хотел бы отметить пару вещей:

  • Вам повезло с погодой (возможно, что это влияние климатических изменений и так оно и останется). Я помню, когда там полтора года шел дождь без остановки. Да, он был зачастую мелкий, и может были просветы в пару дней, но в целом было весьма депрессивно.

  • В BC есть отдельно luxury tax, и он начинается на машины с $55k. Возможно, проще купить в Альберте и зарегистрировать в BC, но я не знаю, меня поставили в известность пост-фактум, я про это даже не знал.

Похоже что автор оригинального текста совершенно не следит за текущими трендами, и есть намного лучше статьи, которые стоит переводить, например: https://verdagon.dev/blog/when-to-use-memory-safe-part-2

Есть очень много проектов, включая от крупных корпораций, которые работают над болячками текущих ЯП, и думаю, мы увидим ещё много чего интересного. И анализировать будущее по поисковым запросам, это вообще последнее дело, потому что профессионалы вообще могут не использовать гуглы и stack overflow, а просто читать документацию (!!!).

Статья немного перекликается с работой, которую я проводил месяц назад. Скажу сразу, что для меня это был рабочий проект, так что он под NDA и исходники не могу выложить. Но у меня тоже было сравнение Go и Rust (и другие решения включая чистый Си), но только в совершенно другом масштабе: мне нужно было нагрузить наши железки высокоуровневым (высшие слои OSI) трафиком под завязку. iperf-тесты уже были, но нам нужен был реалистичный трафик.

Мои результаты на localhost на моем рабочем linux ноутбуке (задейственны все ядра CPU, никаких мьютексов и других пожирателей CPU, статистика собиралась lock-free алгоритмами, сокеты с TCP_NODELAY):

  • Go - 400 тыс запросов секунду

  • Tokio/hyper - 300 тыс запросов в секунду (да, у меня эта пара оказалась медленнее, но у меня была немного другая методика тестирования)

  • Чистый epoll (rust и C показали примерно одинаковые результаты) - 600 тыс запросов в секунду

  • io_uring (пробовал только Rust, программировать на Си все-равно не собирался), тестировал пакеты glommio и monoio - 800 тыс. Остановился на последнем потому что есть fallback на epoll (старые linux) и kqueue (macos).

Ещё хотел бы отметить про hyper - я от него в конце отказался полностью и написал специализированный генератор и парсер HTTP, благо протокол простой. Flamegraph показал что hyper тратит слишком много времени CPU, и хотя у него могут быть более корректные по стандарту парсеры, для benchmark-а он стал бутылочным горлышком.

Таунхаус (меньше площадь, меньше окна, плюс общие стены с соседями, которые эту стены греют, плюс меньше продувается из-за этих же стен) 2014 года (достаточно новая теплоизоляция, ещё не осевшая в стенах) vs detached house (больше площадь, большие окна, продувается всеми ветрами) 2003 года (да, надо обновлять теплоизоляцию, но мне даже страшно представить сколько это стоит). Также много зависит от района, Калгари в целом весьма ветреный, а в нашей локации все весьма плохо.

Думаю, мне надо было уточнить, что я не имел в виду нормальные каркасники, в которых можно жить по 100 лет и более, а то недоразумение, которое строится сейчас в Северной Америке. Вот, например, вы говорите про балки, а я могу сказать сразу что тут строят так совсем не всегда, и я видел своими глазами, как проседают полы, и мои друзья ругались с контрактниками, чтобы они еще одну балку жесткости ставили.

Вот здесь детали: https://constructionphysics.substack.com/p/balloon-framing-is-worse-is-better По сути, вся нагрузка идет на стены, подпорки могут внутри поставить, но обычно опять-таки, вместо них обычно ставят дополнительные стены внизу.

И я не защищал кирпичные дома, и всеми руками за современные технологии. Но я просто вижу какое убожество тут строят, и современными технологиями тут зачастую и не пахнет. Я у себя дома все потолочное освещение менял (тут по умолчанию ставят вырвиглаз 50-летней давности), там зачастую даже заземление не было прикручено, а люстра могла держаться чуть ли не на проводах.

Каркасники для холодного климата вообще не подходят, когда у меня сломалась печка, температура дома упала на 3-4 градуса за час, а еще даже не сильные морозы были. Я читал профессиональные статьи по этому поводу (потому что у таких домов есть и другие проблемы, и сейчас это становится актуально):

  • это самое дешевое, что можно построить. В Северной Америке одни из самых высоких оплат труда, и чем быстрее и проще залепить, тем дешевле.

  • это самое простое, что можно ремоделировать. В золотые времена было нормально жить в доме не больше 5 лет здесь, потом его продать, и новые хозяева могут переделать все как хотят относительно дешево.

  • дешевая энергия - намного дешевле жечь газ или электроэнергию (особенно в США, там и сейчас весьма дешево), чем использовать энергосберегающие технологии. Сейчас это становится актуально, и начинают задумываться об улучшении технологий строительства.

В целом, это просто старая ментальность появившаяся в 50-х, у которой сейчас к счастью идет процесс ломки - можно построить некачественный продукт, который потом не жалко поменять или сломать. Ни о какой преемственности поколений, когда в доме живут больше 20 лет, разговоров вообще не было.

Оттава - замечательный семейный город, были несколько раз, и думаю, он несколько недооцененный. Нравится сеть Play Food & Wine (очень хороший pairing, да и сама кухня замечательная), историческая информация про памятники архитектуры (напр. что один из самых шикарных отелей там был построен изначально как конюшня) и то, что если ликерные закрыты, можно перейти/переехать по мосту во французскую часть и купить там что-нибудь на любой заправке.

Но, к сожалению, просто не наше, не хватает динамики. Пример - у меня супруга поклонница Властелин Колец, и в прошлом году мы посетили Comic Con в Калгари, где она смогла взять автограф и сфотографироваться с Элайджа Вудом. В Оттаве такое не происходит (как и многое другое, например, концерты крупных звезд). Да, можно относительно быстро добраться до Торонто, но по итогу, тогда уж лучше там и жить.

Про цены для сравнения (если бы изначально знали про это и осели в Оттаве, может все по другому и повернулось). В Калгари preschool бесплатных нет, около 1000+ в месяц full day, и 300 за два-три часа в день два раза в неделю (и это с учетом субсидий). daycare - также от 1000, обычно 1200-1400. Бассейнов тут точно нет, климат не позволяет, есть splash park-и, но на свой страх и риск (иногда бывает жара, может неделю-две за все лето). Правда про катки думаю тут не честно сравнивать - здесь идеальный зимний рай, чего только стоит покататься на коньках на Lake Louse.

В США явно не всем будет лучше, поэтому приведу только свои критерии:

  • медицина и налоги, как уже сказано в параллельной ветке. Для примера, самая лучшая по налогам провинция в Канаде (Альберта) хуже, чем самая худший штат в США (Калифорния). Правда, имею в виду только income tax.

  • Road trips. Проездил всю западную и часть восточной Канады и США. Дороги в США (по-крайней мере федеральные) лучше, инфраструктура тоже удобная для автомобилистов. Но должен признать что ковид подпортил везде, посмотрим как все изменится.

  • перелеты. Вне Торонто, и может частично Ванкувера, перелеты баснословно дорогие, и дерут деньги за все. В США все намного проще, особенно если жить в хабах, которых явно больше.

  • Культурные достопримечательности, музеи Нью-Йорка и других крупных городов. Естественно, не сравнится с Европой, но может в конце концов туда и уедем.

Все остальное, мне кажется, примерно похоже с Канадой. Да, в канадских школах не стреляют, но мне кажется, это вопрос времени. Я уже видел какой беспредел сейчас устраивают подростки, такого раньше не было.

7 лет в Ванкувере жизнью динков, было просто шикарно, особенно первые годы, когда ещё кондо в Коквитламе можно было купить за 150 тыс. (опыт моих друзей, продали в 2018 за 750 тыс). К слову сказать, мы платили за отдельную часть дома, 800 в месяц, общая площадь 100 кв.м, North Burnaby, что весьма хороший район. Но было видно даже за 7 лет, что quality of life снизился, даже безотносительно цен:

  • Город стал азиатским, как то гуляли поздно вечером в центре, и по ощущениям как будто в Китае оказались (где мы в реальности были много раз): красный неон, все по китайски, китайская речь, запаха тоже азиатские. В принципе, к Китаю отношусь нейтрально, но знаю случаи буллинга китайскими детьми белых в школах Ванкувера. Взрослые вроде ведут себя нормально.

  • Трафик ухудшился, постоянные пробки и даже не в центре, агрессивное вождение, случаи road rage-а точно известны.

  • Парковки во все парки забиты, уже съездить погулять стало проблемой. К счастью, public transit нормальный, park and ride, или даже просто приехать в центр и запарковаться на подземной парковке вполне опция. Никогда не имел проблем, но знаю лайфхак - можно парковаться в офисных зданиях, там есть гостевые парковки.

  • В целом, жить можно, природа красивая, климат приемлемый, есть не только outdoor, но и социальная жизнь. Но конечно дорого, и это отражается даже на вывесках везде help needed, так как никто за копейки не хочет работать (впрочем то же самое про Торонто).

Калгари тоже изменился - во время ковида сюда переехало просто не счесть людей. У нас был тихий район, а сейчас проездной. Здесь альтернативно одарённые умом градостроители решили что roundabout - это наше все, и налепили их везде. Теперь можно спокойно 15-20 минут стоять, чтобы просто на него въехать.

В целом Канада испортилась. Думаю, если выплачена ипотека, есть свой круг друзей и ограниченный набор интересов, то жить можно. Но если есть широкие интересы, как у нас, то тяжко. Просто для примера, часовой перелет (например Калгари - Ванкувер) стоит 100-300 долларов, в США очень часто можно меньше 100. Банфф когда-то 90 долларов за сутки можно было найти отель, сейчас самый зачуханный может до 600 стоить в сезон.

Думаю, моя основная претензия - все-таки медицина и образование. Всё это ухудшилось, в том число из-за массового притока, но при этом ничего толком нового из этих областей не строится. Когда я иммигрировал, надо было английский на хороший балл сдавать, сейчас сильно понизили. Это сказалось и на образовании, не говоря уж про повестку: стучи на родителей, все белые агрессоры и должны преклонять колено, ну и конечно цисгедерные отношения ненормальны. Здесь это вообще на поток поставлено.

Живу в Канаде 12 лет, этот год будет последний, переезжаем в США. Хочу немного дополнить автора:

  1. Жизнь dink-ов (double income, no kids) != жизни с детьми (собственно, поэтому и уезжаем). Торчать в emergency 10 часов, чтобы потом сказали, пейте обезболивающее, а на следующий день ребёнок чуть не умирает, и его откачивают из 911, малости радо. Вон летом в Келовне ребёнок умер от ангины (в цивилизованной Канаде!!!)

  2. Дом, даже в такой глуши, как Калгари, удовольствие ещё то. Торонто относительно тёплый, а здесь за отопление можно спокойно отдавать 300+ в месяц (у нас утилити иногда доходят до 600, но мы позволяем для себя роскошь держать дома 24 градуса тепла). Каждый год расходы стабильно увеличиваются, по двум причинам: налог на воздух ( carbon tax, пока ещё с rebate, но насколько я понимаю, потом его отменят), и обновление инфраструктуры энергокомпаний (Трюдо сказал же что всех нужно пересадить на электромобили через несколько лет, но естественно расходы идут на налогоплательщиков).

  3. Парикмахеров лучше искать русскоговорящих. У нас в Калгари наплыв из Украины, и мастеров, причём очень хороших, стало много. Правда к Торонто это может не относится.

  4. Costco рулит. Я его не любил, но цены и ассортимент меня переубедили. Думаю, две моих самых любимых сети - это Costco и Ikea (причём последний из-за ресторана, мебель не очень). Walmart лучше из жизни исключить, они когда-то были дешёвые, но сейчас нет, и price matching тоже убрали.

  5. В Reddit-e есть хорошие тематические или географические канадские группы. Именно через них я в свое время нашёл хорошие и дешёвые сотовые и интернет. Но учтите, что здесь нет идеала, в Канаде самая настоящая олигополия, так что за достойные услуги приходится платить.

Мы начинали с markdown, но в итоге полностью перешли на asciidoc, когда наши аудиторы попросили переформатировать таблицы в соответствии с официальными требованиями. К счастью, конвертер автоматический и работа заняла недолго.

У markdown достаточно бедное форматирование и даже подсветки синтаксиса кода нет из коробки. Да, есть расширения и прямое использование html, но это все выглядит полумерами. Например, с помощью asciidoctor у нас есть:

  • TOC (в markdown требуется скрипт для генерации)

  • Диаграммы (mermaidjs или PlantUML), gitlab поддерживает автоматически

  • Include (самое мощное что есть, все примеры кода у нас рабочие и вставляются из реального кода), поддерживается gitlab, вряд ли когда-нибудь будет поддерживаться github

  • Admonitions (вставки NOTE, WARNING etc)

Думаю, не помешали бы примеры, почему надо все время учиться, потому что видно, что есть недопонимание. Базовые вещи (алгоритмы) не особо поменялись (хотя, например, современный qsort - это уже не старый книжный, а модифицированный: https://awdesh.medium.com/dual-pivot-quick-sort-javas-default-sorting-algorithm-for-primitive-types-77342e1df5e5)

Просто приведу примеры тех технологий, которые использую по работе, и которых точно не было в прошлом веке:

  • zstd (2015) - использовать в наше время gz просто уже стыдно

  • linux kernel namespaces (2002)/cgroups (2007) - docker, LXC и в целом OCI

  • sponge functions (2007) - основа современных стандартов криптографии (SHA-3, и в этом году NIST выберет победителя для lightweight/hardware encryption)

  • SIMD (все это было и раньше, но SSE и NEON появлились только в этом веке)

  • сетевые протоколы (QUIC, DNS-over-HTTPS, WebRTC etc) - очень много появилось в последние два десятка лет.

И это надо знать - шифрование, сжатие данных, сети, контейнеры - это все входит в арсенал практически любого профессионального программиста. Если кому-то это не надо, то это очень узкий специалист.

Для сравнения скорости необходимо намного больше трудозатрат для проекта, и это не входило в рамки оригинального PoC. Но могу сразу сказать, что Lua достаточно хорош - он и компактный и достаточно быстрый. Но если скорость - это первичный критерий, то надо смотреть на другие бенчмарки (например, после того как Google вбухал огромный деньги в JS, он стал одним из самых быстрых встраиваемых ЯП, но при этом он и весьма увесистый).

На самом деле, не такая уж приличная разница (что подтверждается другими бенчмарками, которые я курирую). Мои данные:

Современная архитектура: Intel Xeon E-2324G

Go (go3, go run concgo.go s): 748,502,994
Rust (rust2, cargo run --release s, запуск как у автора): 941,619,585
Rust (rust2, cargo run --release s, изменён Cargo.toml): 939,849,624
Rust (rust2, RUSTFLAGS="-C target-cpu=native" cargo run --release s, Cargo.toml + target-cpu=native): 965,250,965

В данном случае, lto дает даже чуть худшие результаты, но это прогрешности, и я никогда не видел, чтобы были реально лучше результаты (использование cpu=native совершенно другая история, и это реально может давать улучшения). Насколько я видел, LTO имеет смысл когда линкуются много файлов, и для этого данного теста это не особо важно.

1
23 ...

Информация

В рейтинге
3 900-й
Откуда
New Jersey, США
Дата рождения
Зарегистрирован
Активность