Вышла новая версия Rust — современного языка системного программирования, ориентированного на безопасность, скорость и параллелизм. Обновления Rust выпускаются каждые несколько недель, поэтому новые версии приносят относительно немного изменений.
SIMD
В Rust 1.27 была добавлена поддержка явного использования SIMD — набора инструкций процессора, одновременно оперирующих над несколькими наборами данных, что позволяет ускорить работу алгоритмов, занимающихся обработкой данных, в несколько раз. Использование SIMD ортогонально использованию многопоточности; для оптимальной производительности нужно использовать оба подхода одновременно.
Во многих случаях компилятор способен автоматически использовать инструкции SIMD при генерации кода прораммы (автовекторизация); тем не менее, в некоторых случаях программе может быть важно явно управлять использованием SIMD, что и позволяет делать добавленный в Rust 1.27 модуль std::arch
.
Многие из библиотек и инструментов, написанные на Rust, уже были ускорены за счёт использования SIMD. Например, инструмент поиска ripgrep
, замена инструменту grep
, теперь может работать в несколько раз быстрее:
$ time cat OpenSubtitles2016.raw.en > /dev/null
real 0m1.280s
user 0m0.020s
sys 0m1.257s
$ time wc -l OpenSubtitles2016.raw.en
336602465 OpenSubtitles2016.raw.en
real 0m4.303s
user 0m3.132s
sys 0m1.167s
$ time rg-with-simd -c 'Sherlock Holmes|John Watson|Professor Moriarty' OpenSubtitles2016.raw.en
6033
real 0m2.099s
user 0m1.750s
sys 0m0.347s
$ time rg-without-simd -c 'Sherlock Holmes|John Watson|Professor Moriarty' OpenSubtitles2016.raw.en
6033
real 0m4.128s
user 0m3.781s
sys 0m0.343s
$ time rg-with-simd -c 'Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty' OpenSubtitles2016.raw.en
6731
real 0m1.989s
user 0m1.621s
sys 0m0.366s
$ time rg-without-simd -c 'Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty' OpenSubtitles2016.raw.en
6731
real 0m18.417s
user 0m18.000s
sys 0m0.403s
Сами по себе инструкции SIMD являются относительно низкоуровневыми, поэтому в экосистеме Rust уже есть несколько пакетов (crates), предоставляющих высокоуровневый интерфейс к SIMD, такие как пакет с говорящим названием faster. Он позволяет писать код, использующий SIMD, в стиле, максимально похожем на обыкновенное использование итераторов. Так, вместо
let lots_of_10s: Vec<u8> = (&[-10i8; 3000][..]).iter()
.map(|v| v.abs() as u8)
.collect();
assert_eq!(lots_of_10s, vec![10u8; 3000]);
для использования SIMD при помощи faster достаточно написать
let lots_of_10s = (&[-10i8; 3000][..]).simd_iter()
.simd_map(i8s(0), |v| v.abs())
.scalar_collect();
assert_eq!(lots_of_10s, vec![10u8; 3000]);
dyn Trait
В Rust 1.27 появилась поддержка нового синтаксиса для типов объектов типажей, dyn Trait
. Старый синтаксис, при использовании которого тип объектов типажей обозначается так же, как и сам типаж, Trait
, обладает несколькими недостатками, в том числе он не подчёркивает использование виртуального вызова (динамического разрешения метода) и его легко перепутать с использованием обобщений (generics) или impl Trait
.
Начиная с версии 1.27, вместо Trait
в качестве типа объектов типажей поддерживается и рекомендуется использовать dyn Trait
(например, Box<dyn Foo>
вместо Box<Foo>
, &dyn Foo
вместо &Foo
и &mut dyn Foo
вместо &mut Foo
). Старый синтаксис по-прежнему поддерживается для обеспечения совместимости.
Прочее
Кроме того, в Rust 1.27 была добавлена поддержка атрибута #[must_use]
при объявлении функций (ранее этот атрибут мог быть использован только при объявлении типа). В стандартную библиотеку было добавлено несколько функций, в том числе process::id()
и os::unix::process::parent_id()
, позволяющие получить номер текущего и родительского процессов соответственно, Option::filter()
, позволяющая отбрасывать опциональные значения, не подходящие под заданное условие, и небезопасная (отмеченная как unsafe
) функция hint::unreachable_unchecked()
, вызывающая неопределённое поведение, что позволяет компилятору дополнительно оптимизировать код без учёта случаев, приводящих к выполнению этой функции.
С подробным списком изменений можно ознакомиться в GitHub-репозитории проекта.
Источник: блог Rust