Что быстрее rust или c
Перейти к содержимому

Что быстрее rust или c

  • автор:

Rust vs C++ — руководство для инженеров

Как эксперты в области электронных встроенных систем, мы видим множество компаний, нанимающих инженеров и разработчиков программного обеспечения с опытом работы с C++. C++ уже некоторое время является популярным языком программирования для разработки встраиваемых систем благодаря своей низкоуровневой функциональности и эффективности кода.

Однако за последнее десятилетие набирает популярность новый язык программирования, который был разработан как усовершенствование C и C++. Rust — это современный язык, который был признан самым популярным языком программирования в опросе разработчиков Stack Overflow 2023 года и регулярно выбирается вместо C++ как более безопасная и эффективная альтернатива.

Когда дело доходит до Rust и C++, между двумя языками есть много общего, что означает, что их можно использовать с одинаковыми положительными результатами для широкого круга проектов. Однако некоторые особенности Rust и C++ делают их более подходящими для определенных требований проектов или типов программ, а также предоставляют различные преимущества и недостатки, которые могут предпочесть разработчики.

В этой статье мы сравниваем производительность, использование и эффективность Rust и C++, чтобы помочь вам узнать больше об обоих языках программирования и решить, какой из них лучше для вас.

ЧТО ТАКОЕ ЯЗЫК ПРОГРАММИРОВАНИЯ RUST?

Язык программирования Rust был разработан в 2010 году Mozilla, организацией по разработке программного обеспечения, которая разрабатывает и распространяет бесплатное программное обеспечение и стандарты для всех. Это относительно современный способ написания кода, изначально созданный для преодоления проблем с памятью и безопасностью, с которыми разработчики сталкивались при использовании C или C++.

Разработчики используют Rust для создания безопасных приложений для самых разных целей. Это мультипарадигменный язык со статической типизацией, который эффективно использует память и очень быстр, поэтому многие люди начали использовать его вместо C++.

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

Rust превратился из языка программирования, созданного для решения проблем с памятью, в один из самых популярных языков, используемых разработчиками во всем мире. Множество ведущих компаний используют Rust в своих системах и программах, от Dropbox до Discord.

Преимущества ржавчины

  • Rust считается одним из самых безопасных языков программирования благодаря функциям предотвращения ошибок и среде со статической типизацией.
  • Модель памяти языка означает, что безопасно писать код вокруг общих структур данных.
  • С помощью Rust довольно легко масштабировать проекты кодирования вверх и вниз, поскольку он был разработан разработчиками веб-браузеров.
  • Параллельный код легко написать, не полагаясь на параметры синхронизации или блокировки.
  • Вы можете предоставить вашему компилятору информацию, которая облегчит ему идентификацию и отметку ошибок.
  • Высокопроизводительный код можно безопасно писать, не полагаясь на библиотеки, благодаря низкоуровневому контролю над системными ресурсами.
  • При написании кода на Rust можно использовать компилятор, который предлагает сообщения об ошибках и поддержку инструментов.
  • Rust считается относительно «новым» и «многообещающим» языком, а это означает, что предстоит сделать много захватывающих потенциальных разработок.

Недостатки ржавчины

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

ЧТО ТАКОЕ С++?

C++ разрабатывался между 1979 и 1983 годами как расширение языка программирования C. Первоначально он назывался «C с классами», потому что это объектно-ориентированный язык, в котором группы данных обычно называются «объектами» или «классами».

Разработчики используют C++ как универсальный кроссплатформенный язык программирования. Он поддерживает объектно-ориентированное, процедурное и универсальное программирование и, как правило, является очень быстрым и эффективным языком для работы.

Вы можете использовать C++ для написания самого разнообразного кода, поэтому он получил прозвище «швейцарский армейский нож» среди языков программирования. Ключевой особенностью и преимуществом использования C++ является то, что он позволяет повторно использовать инструкции кода, которые вы уже написали, что делает программирование более быстрым и эффективным. Вы также можете создавать «классы», которые выполняют сложные функции, многие из которых невозможно выполнить с помощью других языков программирования.

C++ обычно используется при разработке встроенного программного обеспечения из-за его универсальности и совместимости со встроенными устройствами. Опыт программирования на C++ является желательным качеством для разработчиков, которые хотят работать со встроенными системами, и многие наши клиенты стремятся нанять его.

Преимущества С++

  • Вы можете очень легко сортировать данные с помощью C++, потому что это объектно-ориентированный язык.
  • Память управляется диспетчером программ на C++, что дает программисту больше контроля.
  • Код, написанный на C++, легко использовать повторно.
  • Сходство между C и C++ означает, что программы на C, написанные без ошибок, также могут работать как программы на C++.
  • Переносимость C++ означает, что одну и ту же программу можно запускать в разных операционных системах и интерфейсах.
  • Низкоуровневые манипуляции для проектов прошивки возможны с C ++ благодаря его сходству с машинными языками.
  • Масштабируемость C++ очень широкая, то есть его можно использовать как для очень маленьких, так и для очень больших проектов.
  • Мультипарадигмальный аспект C++ означает, что программистам предоставляется полезная структура, на основе которой они могут кодировать в различных стилях.
  • C++ имеет большое сообщество пользователей, а это означает, что в Интернете доступно много поддержки и руководств.

Недостатки С++

  • C++ не очень удобный язык программирования для начинающих, потому что его синтаксис очень сложен.
  • Говорят, что довольно сложно разобраться с использованием «указателей» при кодировании на C++.
  • Встроенные потоки кода не поддерживаются в C++.
  • Объектно-ориентированные языки программирования, такие как C++, известны своими проблемами безопасности.
  • Система объектной ориентации C++ часто считается базовой по сравнению с другими языками программирования.
  • Ручное управление памятью и отсутствие функции сборщика мусора может удлинить процесс написания кода.

РАЗЛИЧИЯ МЕЖДУ RUST И C++

Одним из ключевых различий между Rust и C++ является безопасность памяти. Несмотря на то, что были разработаны обновления, которые улучшили безопасность памяти кода C++, Rust по-прежнему обеспечивает гораздо более безопасное управление памятью благодаря встроенным функциям для процедур управления.

Другое ключевое отличие заключается в том, что Rust имеет статический тип, а C++ — динамический. Это означает, что процесс проверки кода, написанного на Rust, гораздо более тщательный, а это означает, что программы на Rust обычно считаются более безопасными, чем программы, разработанные на C++.

Эта улучшенная безопасность также делает Rust более производительным языком, чем C++. Более высокие стандарты безопасности означают более низкие затраты на процесс разработки, поскольку Rust оценивает жизнеспособность кода и решает проблемы с памятью, пока код компилируется, а не работает.

Обратной стороной всех этих преимуществ Rust является тот факт, что C++ существует и используется намного дольше, а это означает, что в нем гораздо больше информации и примеров того, что вы можете делать с кодом. В то время как стандартные библиотеки Rust очень хороши, C++ имеет более стабильные и многофункциональные библиотеки, что дает ему преимущество в этом смысле. Компиляторов для C++ также больше, чем для Rust.

C++ — объектно-ориентированный язык, а Rust — нет. Многие люди считают эту разницу преимуществом, поскольку в C++ есть такие функции, как полиморфизм, шаблоны, объекты и наследование.

Наконец, хотя популярность Rust как языка программирования растет, в настоящее время все больше продуктов создается с использованием C++. Поэтому сейчас проще устроиться на работу разработчиком программного обеспечения на C++, чем работать в основном на Rust, хотя это может измениться в будущем.

Ищете работу? Хотите сменить профессию и повысить свой доход? Подписывайтесь на Телеграмм канал «Каждый находит». Мы помогли 8000+ соискателям найти работу!

ЧЕМ ХОРОШ ЯЗЫК ПРОГРАММИРОВАНИЯ RUST?

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

Mozilla изначально разработала Rust, так что это также отличный язык для создания веб-браузеров. Параллелизм — ключевая особенность Rust, поэтому можно легко выполнять несколько вычислений одновременно, не влияя на функциональность.

Хотя Rust не так доступен, как другие языки программирования, в целом на нем легче программировать, потому что легче предотвратить нежелательное поведение. Поэтому Rust — отличный язык, если вы хотите быстро и продуктивно писать код, не беспокоясь о проблемах с памятью или незамеченных ошибках.

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

ДЛЯ ЧЕГО ХОРОШ С++?

В споре Rust и C++ C++ по-прежнему считается лучшим языком для разработки игр. Язык очень близок к аппаратному обеспечению, на котором работают игры, поэтому это идеальный выбор для сложных 3D-игр, которые работают быстро и плавно.

Любое объектно-ориентированное программирование лучше на C++ из-за функциональной природы Rust. Это делает C++ лучшим выбором для больших и сложных проектов кодирования, которые могут нуждаться в регулярном обслуживании или обновлении, или для совместных проектов, когда несколько разработчиков работают над кодом одновременно.

«Новизна» Rust по сравнению с C++ означает, что многие разработчики рекомендуют вам по-прежнему использовать C++ при создании интерактивных программ, поскольку Rust не будет так же хорошо работать с взаимодействием с внешними источниками. Тот факт, что C++ существует дольше, также означает, что если вы хотите сделать что-то действительно специфическое или нетрадиционное со своим кодом, скорее всего, будет больше существующей поддержки или рекомендаций по C++, а не по Rust.

КРАТКОЕ СОДЕРЖАНИЕ

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

В секторе встроенных систем C++ и Rust используются для разработки встроенного программного обеспечения с очень положительными результатами. Rust все еще находится на относительно ранней стадии своей популярности, поэтому еще предстоит определить, превзойдет ли он C++ в качестве предпочтительного языка программирования для такого рода программного обеспечения.

Мы — ИТ кадровое агентство, которое поможет вам найти разработчиков за менее чем 2 недели. Свяжитесь с нами уже сегодня, чтобы узнать, как мы можем помочь масштабировать ваш следующий проект. Мы гарантируем поиск самого сильного кандидата, а не самого дорогого. За 10 лет мы закрыли более 5500 вакансий и собрали более 25 команд с нуля. Вы можете ознакомиться с отзывами наших клиентов о нашем рекрутинговом агентстве. Если вам нужны дополнительные референсы, напишите нам в Telegram.

Сравнение производительности ввода/вывода: C, C++, Rust, Golang, Java и Python

Без интернета компьютер становится не таким уж полезным устройством, а некоторые приложения и вовсе не работают. И хотя соотношение операций ввода/вывода может немного различаться, их вклад в задержку сервиса может быть вполне ощутимым.

Сейчас существует большое количество языков программирования для создания бэкенд-сервисов. Это вызывает интерес в сравнении их производительности по различным критериям. К примеру, сервис Benchmarks Game сравнивает языки программирования на основе того, как они решают различные задачи. А TechEmpower измеряет производительность веб-фреймворков.

Эти сервисы дают возможность примерно производительность языков. Но проблема в том, что они измеряют лишь специфичные параметры и выборки операций, которые не совсем точно показывают реальную картину.

Это сподвигло меня выяснить настоящую стоимость затрат ресурсов, необходимых для “голого” ввода/вывода на различных платформах. Измерение прокси TCP, кажется, дается проще всего. Он включает только обработку входящих и исходящих соединений, а также передачу необработанных байтовых данных.

Микросервис в любом случае не может быть быстрее прокси TCP, потому что это минимально возможный функционал. Зато микросервисы могут справляться с нагрузкой побольше. Вся остальная функциональность строится поверх основы: парсинг, валидация, обходы, сжатия данных, вычисления и так далее.

Можно сравнить следующие решения:

  • HAProxy в режиме TCP-прокси. Сравнение со старой реализацией на языке С: http://www.haproxy.org/.
  • draft-http-tunnel — простое решение на C++ с базовой функциональностью ( trantor ), запущенное в режиме TCP: https://github.com/cmello/draft-http-tunnel/.
  • http-tunnel — простой HTTP-туннель/TCP-прокси, написанный на Rust ( tokio ) и запущенный в режиме TCP: https://github.com/xnuter/http-tunnel/.
  • tcp-proxy — реализация на Golang: https://github.com/jpillora/go-tcp-proxy.
  • NetCrusher — реализация на Java (Java NI0). Тесты проводились на JDK11 с модулем G1: https://github.com/NetCrusherOrg/NetCrusher-java/.
  • pproxy — решение на Python, основанное на asyncio , запущенное в режиме TCP-прокси: https://pypi.org/project/pproxy/.

Все представленные выше решения используют неблокирующий ввод/вывод (non-blocking I/O). Если вам нужен действительно быстрый сервис с быстрым временем отклика и большой пропускной способностью, то можно воспользоваться этими прокси.

Примечание: я пытался подобрать лучшие реализации на Golang, Java и Python, однако допускаю, что могут найтись и другие решения на основе других материалов. В качестве бэкенд-сервера был выбран Nginx, который настроен на передачу 10 килобайт данных в режиме HTTP.

Результаты сравнения разделены на две группы:

  • Baseline, C, C++, Rust — высокопроизводительные языки.
  • Rust, Golang, Java, Python — языки с автоматическим управлением памятью.

Да, Rust есть в обоих списках.

Краткое описание методологии

  • Два ядра выделены для TCP-прокси (cpuset).
  • Еще два ядра выделены под бэкенд (Nginx).
  • Частота запросов начинается с 10 000, а затем плавно поднимается до 25 000 запросов в секунду (ЗВС).
  • Подключения будут переподключаться каждые 50 запросов (по 10 кб на запрос).
  • Все измерения запущены на одной виртуальной машине для исключения любых помех в соединении.
  • Виртуальная машина запущена в режиме вычислений (использует все доступные мощности процессора), чтобы избежать неточностей из-за работы фоновых программ.
  • Время отклика измеряется в микросекундах.

Для сравнения использовались следующие характеристики:

  • Перцентиль (от 50 до 99) — ключевая характеристика.
  • Погрешность (99.9 и 99.99) критична для компонентов крупных распределенных систем.
  • Максимальное время отклика (никогда не следует пренебрегать такими данными).
  • Среднее усеченное значение — значение без учета 0,1% лучших или худших исходов вычисления для вычисления среднего значения (без погрешности).
  • Стандартное отклонение от нормы — для расчета стабильности времени отклика.

По ссылке можно почитать о методологии и о том, почему были выбраны именно эти характеристики. Для сбора данных использовалась программа perf-gauge.

А теперь перейдем к результатам.

Сравнение высокопроизводительных языков: C, C++, Rust

Часто говорят, что Rust стоит наравне с C/C++ с точки зрения производительности. Рассмотрим, насколько именно “наравне” они находятся в плане обработки ввода/вывода. Ниже показаны четыре графика в порядке языков: точка отсчета, C, C++ и Rust.

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

А вот как это выглядит в сравнении (потери пропускной способности в процентах от базовой точки отсчета):

Интересно, что прокси, написанный на C++, немного быстрее, чем HAProxy и Rust на уровне 99,9, однако медленнее на уровне 99,99 и выше. Стоит отметить, что, вероятно, это особенность простой реализации прокси, которая написана на колбэках, а не на обработке событий. Кроме того, были произведены замеры потребления памяти и мощности процессора. С ними можно ознакомиться по ссылке.

В заключение хочется сказать, что все три TCP-прокси, написанные на C, C++ и Rust, показали схожую производительность, а также плавную и стабильную работу.

Сравнение языков с автоматическим управлением памяти: Rust, Golang, Java, Python

А теперь приступим к сравнению этой выборки языков. К сожалению, решения на Java и Python не смогли справиться с 25 000 запросов в секунду всего на двух ядрах, поэтому Java была измерена на 15 000 ЗВС, а Python — на 10 000 ЗВС. Картинка ниже отражает статистику языков Rust, Golang, Java и Python.

Здесь уже видно значительную разницу. То, как волнообразно показал себя Rust в прошлом тесте, в данном случае выглядит довольно стабильно. Отдельно стоит взглянуть на пик в начале измерения при холодном запуске Java. Цифры в следующей таблице являются средними значениями интервалов на максимальной частоте запросов (повышение частоты не учитывалось).

Golang не отстает на уровнях 50 и 90, однако разница в значениях сильно растет на более высоком перцентиле, что отражается в значения отклонения от нормы. Но взгляните на значения на Java!

Стоит взглянуть на перцентили с отклонениями (99,9 и 99,99). Легко заметить, что разница с Rust просто огромна.

А вот как это выглядит в сравнении (процент от базовых значений Nginx):

В заключение можно сказать, что Rust показывает намного меньшее время отклика по сравнению с Golang, Python и, в особенности, Java. Golang соответствует производительности Rust только на уровне 50 и 90.

Максимальная пропускная способность

Есть еще один интересный вопрос: какое максимальное количество ЗВС может обработать прокси на каждом языке? Как и всегда, полные расчеты можно прочитать по ссылке, а мы перейдем к краткой выжимке.

Nginx способен обработать примерно 60 000 ЗВС. Если между клиентом и бэкендом добавить TCP-прокси, пропускная способность уменьшится. На графике видно, что C, C++, Rust и Golang развивают только 70–80% от пропускной способности Nginx, а Java и Python и того меньше.

  • Синяя линия означает время отклика (левая шкала по оси Y) — чем меньше, тем лучше.
  • Серые столбцы обозначают пропускную способность (правая шкала по оси Y) — чем выше, тем лучше.

Заключение

Эти измерения не являются комплексными и полноценными. Их цель — сравнение “голого” ввода/вывода на различных языках.

На основе этих тестов напрашивается вывод, что Rust может стать лучшей альтернативной по сравнению с Golang, Java или Python, если для вас важна стабильная производительность. Именно поэтому перед тем, как начинать писать программу на C или C++, следует подумать о реализации на Rust. Помимо высокой производительности на уровне C/C++ и того, что он подталкивает к созданию полного скелета программы еще до начала разработки, будут доступны и другие преимущества:

  • автоматическое управление памятью;
  • отсутствие data race;
  • возможность писать сложный код;
  • схожесть с Python;
  • сообщество разработчиков и большая библиотека компонентов.
  • Бенчмарки в Golang: тестируем производительность кода
  • Лучшие практики JavaScript — производительность
  • Улучшите производительность с помощью веб-воркеров

«Rust – не Си на стероидах. Чтобы его изучить, нужно избавиться от предрассудков»

В отличие от нашего прошлого героя, Михаил сделал выбор не в пользу Scala, а предпочел Rust, так как этот язык обеспечивает безопасное использование данных и ресурсов. На нём можно управлять памятью и создавать не только более быстрый, но и более надёжный код. Кстати, Михаил считает C++ не столько базовым языком для Rust, сколько консервативным конкурентом. По его словам, поклонники C/C++ недолюбливают Rust лишь потому, что имеют о нём много предрассудков и пока не осознали преимущества нового языка.

Мы поговорили с ведущим системным программистом департамента разработки компании «Криптонит» Михаилом Дорониным, чьей основной специализацией в компании является программирование на Rust.

Михаил, как ты стал Rust-программистом?

Всё началось с того, что я учился в Колледже космического машиностроения и технологий по специальности радиотехнических комплексов и систем управления космическими аппаратами. Сейчас, кажется, такой специальности больше нет. Есть просто радиотехника. Вот там какие-то основы программирования давали, но мне было не сильно интересно. На тот момент меня больше интересовало что-то, что можно руками потрогать, какой-то реальный радиоприемник сделать…

Как тогда появилась тяга к программированию?

Уже потом я учился заочно, тоже на радиотехнику. Работал в конструкторском бюро, занимавшемся разработкой навигационного оборудования для авиационной техники. Там я всё больше уходил от схемотехники в программирование контроллеров и ПЛИС. В какой-то момент меня знакомые учёные позвали поработать программистом в лабораторию электронно-оптических систем. Она тоже до сих пор успешно работает. Они занимались в основном оптическими датчиками. Например, такими, которые в томографах используются. Там обычный микрофон нельзя поставить, поэтому применяют оптические микрофоны. Подобные вещи применяются в сфере безопасности для охраны периметра, в геологоразведке… Вот на этой работе я был занят прямо супер full stack.

Что именно было нужно программировать?

Сама система уже была написана, требовалось оптимизировать постобработку с Python на C++, разрабатывать веб-интерфейс для АРМ. Много с чем удалось поработать, было очень интересно. Наверное, это моё самое творчески интересное место работы, потому что компания относительно небольшая и в ней нет никакой бюрократии.

Почему выбрал Rust?

Это произошло позже. Потом я долгое время работал в разных компаниях на позиции бэкенд-разработчика на Java и Python, но мне Rust как язык стал больше нравиться. К тому же, я тогда немножко подустал от писания бизнес-логики и программирования высокого уровня. Начинал-то я карьеру с самого низкоуровневого. Потом какое-то время занимался Enterprise-разработкой и обработкой научных данных.

Как давно ты в «Криптоните»?

С октября 2019 года. И я сразу занялся программированием на Rust. Меня пригласил знакомый и сказал, что есть возможность попробовать Rust. Он предупредил, что будет непросто, что наверняка возникнут сложнее вопросы. В «Криптонит» я в принципе пришёл с понижением зарплаты, но на более интересные задачи и перспективы. Мы вначале договорились, что если буду соблюдать определённый план, то з/п повысят. Сейчас у меня и задачи интересные, и зарплата хорошая.

Какие ты видишь преимущества Rust перед Scala?

Отсутствие сборки мусора. Соответственно, вы сами управляете памятью. Вы можете написать код, который будет быстрее работать. В Scala есть явный уклон в сторону верификации кода. Это язык программирования, построенный на строгой научной практике, как Си, например.

Чем ты занимаешься в «Криптоните»?

Я работал над проектом Small files storage, а сейчас мы его активно тестируем. В какой-то момент мы всё-таки приняли решение не писать его с нуля, а допиливать готовые модули.

Какой функционал у этого «хранилища малых файлов»?

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

Переход на SSD не снизил актуальность вашей разработки?

Смысл в ней всё равно остаётся, поскольку твёрдотельные диски всё ещё дороже обычных HDD. Когда у вас сотни терабайт данных, их слишком дорого хранить во флэш-памяти.

Тебе как-то пригодился твой радиотехнический бэкграунд?

Да. Я когда пришёл, мы работали над одним проектом, в котором я занимался оптимизацией производительности, профилированием данных. Вот там мне пригодились мои навыки по цифровой фильтрации. У нас была задача передискретизации аудиоданных, и я увидел, что кое-что делается не совсем правильно, приводя к возникновению артефактов в спектре. Объяснил команде, как надо сделать. Потом ещё делал оптимизацию с векторными инструкциями. Использовал набор инструкций AVX, но без AVX-512, поскольку на рабочих машинах у нас тогда AVX-512 не поддерживался.

CUDA-оптимизацию не пробовали?

Нет, хотя была такая идея. Просто мы не были уверены, что в конечном продукте однозначно будет графический ускоритель с поддержкой CUDA, а SSE2 есть везде, да и на процессоре мы всё успевали просчитать. Не стали усложнять систему.

Как ты оцениваешь перспективы языка Rust? Можно ли с его помощью найти «профессию будущего»?

В основном сейчас пишут на C/C++, Java, Python… и Rust встречает активное сопротивление со стороны программистов старой школы. Очень много людей крайне превратно его понимают, не хотят изучать глубоко, и у них формируется предвзятое отношение. Типа, это «Си на стероидах». Конечно, это не так. В Rust есть уникальные механизмы, другая система типов, свои приятные «плюшки». Он становится популярнее год от года. Я вижу ситуацию так, что ниша Rust будет расширяться в сторону высоконагруженных распределённых систем, а также встраиваемых систем и драйверов Linux.

Какие выгоды может принести Rust в коммерческих проектах?

Для маленьких компаний эти выгоды могут быть неочевидными, а вот крупные смогут экономить сотни миллионов долларов ежегодно. Если они сейчас используют Java, а потом перепишут код на Rust, он, грубо говоря, станет в три раза быстрее и гораздо надежнее за счет более продвинутой системы типов. Поэтому можно прогнозировать, что в ближайшее время какие-то крупные проекты будут переписывать на Rust. Ниша Rust будет расти, простите за каламбур, а ниша Java – сужаться. Например, в Google уже внутренние тулзы для Android-разработки, драйверы и компоненты ядра пишут на Rust. Там ещё энергоэффективность всех процессов считают и борются за снижение выбросов углекислого газа.

На твой взгляд, в чём причина неприятия Rust некоторыми программистами, освоившими мейнстримовые языки?

Есть такой мем, в котором птичка прямо активно что-то отвергает, а потом пробует, и ей нравится. На мой взгляд, с Rust такая же ерунда. Те, кто выступают против Rust, просто его не распробовали. Я ведь тоже при изучении Haskell возмущался и спрашивал себя, почему в этом языке всё так странно? Но это была первая стадия, для которой подобное восприятие типично. Вот до второй стадии — осознания и принятия — мало кто доходит. Это нужно определенный склад ума иметь и математический бэкграунд. Чтобы развиваться дальше, я прошёл много разных курсов по функциональному программированию, посещал соответствующие конференции… тогда и вошёл во вкус. Чтобы хорошо изучить Rust, нужно избавиться от предрассудков и попробовать привыкнуть к его особенностям.

Насколько быстрым получается код на Rust?

Он будет такой же быстрый, как и на С++, даже потенциально быстрее, потому что компилятор в Rust знает о твоём коде чуть больше, чем сишный компилятор. В частности, компилятор знает, что если у тебя есть мутабельная ссылка, то он не может пересекаться с другим. Компилятор в Rust предотвращает типичные ошибки, что повышает безопасность программ и позволяет заодно выполнять некоторые оптимизации при их написании. Также Rust лишён тяжёлого Legacy-наследия Cи, поэтому код на нём получается чище и легче.

С чего стоит начать тем, кто всерьёз планирует осваивать Rust?

Rust приносит идеи из теории типов (аффинные типы) и с помощью них делает низкоуровневый код более безопасным. Соответственно, полезно иметь бэкграунд или теории типов и/или в низкоуровневом ПО: понимать, как работает память, ОС, процессор, указатели… Если изучал высшую математику, хорошо знаешь алгебраические структуры, то лучше сразу начинать с Rust. Мне лично было относительно просто его учить ещё и потому, что к тому моменту я уже понимал, как работает процессор, как устроена память, что такое указатель…

Насколько Rust популярен в других ИТ-компаниях?

Вот не знаю, как сейчас — я ведь уже давно перестал мониторить вакансии. На момент перехода в «Криптонит» на российском рынке было очень мало предложений для программистов на Rust. Когда он появился в 2016 году, многие западные вузы переделали курсы по операционным системам сразу на Rust. Недавно видел доклад Microsoft, в котором представитель компании сказал, что у них около 70% багов происходит из-за небезопасной работы с памятью. Rust эффективно предотвращает такого рода ошибки, поэтому к нему сейчас большой интерес со стороны Microsoft, Amazon, Google и других западных компаний. Они вкладывают много ресурсов в его развитие и в поддержку сообщества специалистов.

А в России такие же тенденции?

Пока ещё нет. Когда-то давно я общался с ребятами из Яндекса, так они оказались достаточно консервативными. Когда услышали, что мне не очень интересно развиваться в C++, но с удовольствием помогу с переходом на Rust, они начали “объяснять”, что С++ лучший язык и никакой Rust не нужен. А спустя лет шесть у них вышел доклад от молодого сотрудника, который рассказывал о преимуществах Rust. Поэтому мне кажется, что в России переход на Rust —это очень вялотекущий процесс.

Можешь дать несколько советов начинающим Rust-программистам? На чём чаще всего спотыкаются, и как преодолеть эти демотивирующие препятствия в изучении языка?

При освоении Rust многие новички сталкиваются с моментом, который называется fight the borrow checker. Его надо преодолеть и дальше всё пойдет гораздо проще. Мне помогло понимание теории типов и осознание, что lifetimes — это (и технически, кажется, так оно и реализовано в компиляторе) параметр типа. Это помогло чисто формально прочитать, что именно мне говорит компилятор, где какие типы у него не совпадают и почему, а потом уже из этого сложить картинку: понять, в чём на самом деле тут проблема с точки зрения работы с памятью, и есть ли она вообще. Этот процесс похож на чтение математического доказательства. Сначала ты прослеживаешь чисто механически каждый шаг, и удостоверяешься, что он верный, и только потом через какое-то время приходит «инсайт» — понимание того, о чём это доказательство, и «почему это так».

Посоветуешь пару-тройку ресурсов по Rust для наших читателей?

Да, вот список основных, которыми я сам пользовался:

  1. https://www.youtube.com/c/JonGjengset — PhD в MIT, делает много стримов про Rust как для новичков, так и для продвинутых. Он же превратил часть материалов в книгу https://rust-for-rustaceans.com/
  2. https://doc.rust-lang.org/book/— официальная книга для новичков по Rust
  3. https://www.packtpub.com/product/rust-high-performance/9781788399487 — неплохая книга, которая в сжатой форме рассказывает об особенностях и лучших практиках языка. Подойдет продвинутым программистам, которые, например, уже знают С++.
  4. https://doc.rust-lang.org/nomicon — про низкоуровневые подробности языка и о том, как писать безопасный «небезопасный код».
  5. https://www.youtube.com/watch?v=IPmRDS0OSxM — в ролике за полтора часа рассказывается о главных особенностях Rust. Рекомендуется тем, кто знает C++.
  6. https://www.youtube.com/watch?v=LjFM8vw3pbU — видео от Брайана Кэнтрилла про то, как он перешёл на Rust. Это очень известный программист из IBM, работавший над Solaris, пока последний не выкупила Oracle.

Rust против C++: что быстрее для программы N-Body?

Play video

TLDR Rust — самый быстрый язык для программы n-body, при этом JavaScript на Node.js всего в 8 раз медленнее благодаря хорошему JIT, и он быстрее C++ за счет меньшего синтаксиса и более простого бенчмарка.

Summarize any YouTube video Summarize any video by yourself

Install on Chrome

Отмеченное временем резюме

Портирование решения на Python в Rust привело к 2000-кратному ускорению, сделав Rust самым быстрым языком для программы n-body, при этом JavaScript на Node.js всего в 8 раз медленнее благодаря хорошему JIT.

Rust был быстрее, чем C++, с меньшим синтаксисом и более простым бенчмарком, и в нём была более безопасная итерация над множествами.

Мы использовали GHIDRA для упрощения рекурсивной функции с миллиардом вызовов в Rust vs C++ для лучшего понимания.

Используйте регистры для оптимизации кода и следуйте x86_64 SysV ABI при вызове функций.

Инструкции Movdqu, Paddq, Pshufd и Add используются для эффективного сложения шести 64-разрядных целых чисел вместе.

Использование трех структур с двумя полями вместо двух структур с тремя полями может помочь компилятору Rust использовать регистры вместо стека.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *