Си  —  это сэнсэй черепашек-ниндзя

«Си  —  язык небезупречный, со странностями, но невероятно успешный». (Деннис Ритчи).

Си  —  это императивный язык программирования общего назначения и один из старейших (создаваться он начал в 1969 году). Его отцом-основателем является Деннис Ритчи. В 1989 году Американский национальный институт стандартов и Международная организация по стандартизации разработали новые консенсусные стандарты для Си. Будучи простым, низкоуровневым языком программирования, который работает на различных платформах, он и сейчас остаётся универсальным и по-прежнему широко используется.

«Говорят, что C++ и Java растут быстрее, чем Си, но я уверен, что Си ещё поживёт».(Деннис Ритчи).

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

Основные части популярных операционных систем, таких как Windows, UNIX и Linux, написаны на Си. Ведь даже сегодня по производительности языку Си нет равных, хотя это не означает, что так будет всегда. Кроме того, если требуется расширить операционную систему для работы с новыми устройствами, нужны программы-драйверы устройств. И эти программы тоже пишутся исключительно на Си.

Язык Си оказывает огромное влияние на сферу информационных технологий и по-прежнему играет здесь жизненно важную роль.

Rust  —  потенциальный конкурент во всех областях

Rust —  это мультипарадигмальный язык программирования с упором на производительность и безопасность, и особенно на безопасный параллелизм. С точки зрения синтаксиса Rust аналогичен языку C++. А что касается безопасности при работе с памятью, Rust обходится без сборки мусора: вместо неё здесь система проверки заимствования.

Разработка Rust была начата Грейдоном Хором в сообществе Mozilla Research.

*rust

В Rust основной акцент сделан на:

1. Параллелизме.

2. Безопасности.

3. Скорости.

Безопасность при работе с памятью

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

Производительность

В языке Rust сборщик мусора не предусмотрен. Rust узнаёт о том, когда переменная выходит из области видимости или когда её время жизни заканчивается, во время компиляции. После чего вводит соответствующие команды ассемблера/LLVM для освобождения памяти. Это повышает производительность во время выполнения.

Вот как Rust работает с памятью.

Многопоточность

Потоки в Rust автоматически «изолируются» друг от друга благодаря такому понятию, как владение. Запись происходит, только когда поток имеет изменяемый доступ —  либо владея данными, либо имея изменяемое заимствование. В обоих случаях поток гарантированно будет единственным, имеющим доступ в любой момент времени.

Поддержка Web Assembly

Web Assembly помогает выполнять алгоритмы с большим объёмом вычислений в браузере, на встроенных устройствах или где-либо ещё. Он запускается со скоростью машинного кода. Rust компилируется в Web Assembly с целью быстрого и надежного выполнения.

Сравнение скорости Си и Rust

Методология

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

Используются следующие алгоритмы сортировки:

1. Сортировка пузырьком.

2. Сортировка вставками.

3. Сортировка выбором.

4. Сортировка Шелла.

5. Пирамидальная сортировка.

* Временная сложность популярных алгоритмов сортировки

Колонки со сложностью в худшем случае (Worst Case) позволяют примерно определить, какой метод сортировки будет выполняться хуже всех.

Для сортировки пузырьком сложность в худшем случае составит O(N²). Это будет худшее выполнение по сравнению с другими методами сортировки. Будет сгенерирована итоговая матрица, которая поможет определить временную сложность в худшем случае. Для этого надо сравнить время, необходимое для сортировки элементов.

Таким образом пишутся все пять алгоритмов на Си и на Rust. Для цели ввода используется массив целых чисел, заполняемый случайными числами с помощью функции-генератора случайных чисел rand() на Си и rand::Rng на Rust. Этот массив задаётся в качестве входных данных для алгоритмов сортировки, а выходные данные записываются в матрицу. Дальше тестируется производительность алгоритмов для трёх диапазонов: 1000, 10 000 и 100 000 элементов.

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

Конфигурация для сравнения производительности

Конфигурация системы, в которой был запущен и выполнен подсчёт значений:

ОС: macOS Catalina.

Машина: MacBook Pro (16 дюймов, 2019 года).

Процессор: 2,3 ГГц 8-ядерный Intel Core i9.

Память: 16 Гб 2667 МГц DDR4.

Версия clang 12.0.0 (флаг оптимизации -O3).

rustc 1.45.2 (флаг оптимизации  —  release).

Статистика производительности

Ниже приводятся сгенерированные матрицы выходных данных:

* Производительность языка Си на различных алгоритмах сортировки.
* Производительность языка Rust на различных алгоритмах сортировки.

Матрица выходных данных показывает примерно равные результаты. Для каждого метода сортировки и каждого диапазона входных массивов в каких-то случаях Rust работает лучше, а в каких-то случаях лучше работает Си. В нижних диапазонах (1000 элементов), за исключением сортировки вставками, Rust работает лучше. В диапазоне 10 000 элементов Cи работает лучше во всех методах сортировки.

* Графическое представление.

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

Можете попробовать, что получится на вашем компьютере.

Вот ссылка на Github проекта.

Заключение

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

Читайте также:

Читайте нас в Telegram, VK и Яндекс.Дзен


Перевод статьи Rushabh Gaherwar: Which is faster: Rust or C? Let’s find out who is the Usain Bolt of programming world.