Написать пост

Вышел Rust 1.27

Аватар Сергей Бугаев

В новую версию была добавлена поддержка явного использования SIMD, поддержка нового синтаксиса для типов объектов типажей и новые функции.

Вышла новая версия 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-репозитории проекта.

Следите за новыми постами
Следите за новыми постами по любимым темам
735 открытий735 показов