Rust превосходит по производительности C++ согласно результатам Benchmarks Game
В начале этого месяца случилась маленькая победа. Согласно последним результатам популярного бенчмарка, сравнивающего производительность языков программирования, Rust занимает второе место, разместившись между C и С++:
Для сравнения производительности используется геометрическое среднее времени выполнения 10 различных программ. Согласно последним результатам Rust превзошел С++ в 6 задачах из 10.
Под катом некоторое детали и мнение о дальнейших перспективах.
Как правильно интерпретировать результаты?
Benchmarks Game — популярный проект, в котором языки программирования сравниваются на основании измерений производительности написанных сообществом программ, решающих поставленные задачи. Как правило, для каждой задачи существует как минимум несколько хорошо оптимизированных реализаций на одном и том же языке. Для подведения общих итогов выбирается только одна реализация для каждого языка, показавшая наилучший результат.
Следует ожидать, что для популярных языков программирования наилучшие предложенные решения близки к пределу производительности самих языков. Последние месяцы языки C, C++ и Rust показывают очень близкие результаты. Таким образом, можно сделать вывод, что хорошо оптимизированная программа на Rust в среднем не должна уступать по производительности хорошо оптимизированным программам на C или C++.
Но ведь бенчмарки ничего не значат!
И да, и нет.
Конечно, разница в производительности различных реализаций для вашей конкретной задачи будет зависеть от множества факторов, и наверняка будет варьироваться значительно от задаче к задаче.
К примеру, Rust показывает худшие сравнительные результаты на тех задачах, решения которых требуют использования регулярных выражений. Из этих результатов можно сделать вывод, что реализация регулярных выражений на Rust (крейт regex) работает медленнее чем PCRE2, при решении поставленных задач. С другой стороны, Rust заметно превосходит C++ для задач, требующих агрессивного применения SIMD операций.
Общий вывод, который следует сделать: выбирая между Rust и С++, производительность больше не может быть ограничивающим фактором чтобы отдать предпочтение Rust. По крайней мере, без проведения дополнительных тестов.
Может ли текущая ситуация измениться?
Вполне. С, C++ и Rust показывают очень близкие результаты. Сейчас разница настолько незначительна, что погрешность измерений заметно влияет на распределение первых мест в общем зачете. Вполне возможно, что в следующем месяце Rust и C++ снова поменяются местами, или С уступит первое место Rust или С++.
Стоит ли ожидать дальнейшего улучшения производительности Rust?
Да. Компилятор Rust — относительно молодой проект, и значительное количество возможных оптимизаций еще просто не реализовано полноценным образом. Основной преградой является LLVM, который формально хоть и является универсальным транслятором, на практике хорошо оптимизирован для C/C++, и не очень хорошо справляется с байт-кодом (IR), полученным из других языков программирования.
Rust — более строгий язык программирования чем C и С++. Это означает, что для типичной программы Rust может дать гораздо больше гарантий транслятору (LLVM), который в свою очередь может их использовать для выполнения более агрессивных оптимизаций.
Таким образом, следует ожидать, что в ближайшие годы Rust сможет заметно улучшить свою производительность. В то же время, компиляторы C/C++ развиваются уже несколько десятилетий, и за это время достигли предела своих возможностей. Их дальнейшие оптимизации ограничены в основном особенностями языка, а не реализациями компиляторов.
Еще несколько лет назад мало кто мог представить, что возможно с высокой эффективностью писать код, превосходящий по производительности реализации на C/C++, используя при этом новый язык программирования и даже (прости господи) функциональный подход. Я думаю, что в ближайшее годы Rust докажет обратное своим примером, начав занимать уверенные первые места в различных тестах производительности. А вы?