В рамках производной второго порядка от флешмоба, изначально стартовавшего
тут, получившего продолжение
тут, и форкнувшегося
здесь, мной был написан небольшой код на расте:
репо.
Про сам перформанс мб в другой раз, а пока я бы поделился некоторыми наблюдениями насчёт собственно языка.
Я уже говорил, что вижу в Rust достаточно большой потенциал. И
(
Read more... )
Comments 22
> Мало того, у нас в наличии ситуация, когда строка аллоцируется в одном потоке, а освобождается в другом (в Си это считается страшным грехом).
И ведь не зря считается, хоть в Си может и по другой причине. При таком подходе в каждом потоке аллокатор должен быть очень thread-safe, позволять параллельную аллокацию и деаллокацию (или лочить мутексы на каждый чих). Это все хорошей скорости не очень способствует.
А в языке с GC Зинаида была бы создана быстрым bump-the-pointer способом (например) и прожила бы счастливо до конца работы данной программы. Передавался бы так же один указатель (возможно толстый, шоб длину не пересчитывать), расходов на деаллокацию могло бы быть на одну Зинаиду меньше.
Reply
Reply
Reply
"Сейчас" -- это когда? :) Полтора года назад glibc-шный аллокатор сильно хуже был: https://github.com/rust-lang/rust/issues/6897#issuecomment-18807015
> Если объект создается в одном потоке и разрушается в другом, то вызов free залочит арену того потока, который создавал объект.
Понятно, спасибо, буду иметь в виду.
Reply
Отличие - в том, что borowing не контролируется (а именно, передача обычного сишного указателя из этого умного в другую функцию), но функции в C++ обычно не сохраняют себе переданный указатель.
Второе отличие, что если используем не std::uniq_ptr, а std::string (который сам себе unique_ptr в том смысле, что есть move-конструктор), то очень легко случайно вместо перемещения использовать копирование. Тем не менее, чаще всего по умолчанию строчка текста скорее всего тоже будет протащена без всяких memcpy и alloc, и без reference counting.
Reply
Но там есть второй важный момент: в с++ ты можешь вызвать функцию, передав параметром uniq_ptr, и потом совершенно свободно продолжить им пользоваться. Поэтому в многопоточной среде нужно обязательно наворачивать синхронизацию. В Rust, после того, как ты отдал ownership, язык тебе просто запретит пользоваться переменной, что даёт тебе мощные гарантии даже в многопоточной среде, при этом сохраняя максимальную производительность.
Я же не случайно упомянул в тексте про масштабные проекты. В микробенчмарках, само собой, практически всегда можно догнать и обогнать Rust любым языком :)
Reply
Не совсем так. У unique_ptr нет оператора копирования. Поэтому вот такая конструкция просто так не скомпилируется:
auto dyn_obj = make_unique< T >(...);
call_something( dyn_obj );
call_something_else( dyn_obj );
Нужно явно определять передачу владения содержимым unique_ptr:
call_something( move( dyn_obj ) );
Конечно, после этого dyn_obj все равно останется в области видимости. Но это уже не так страшно, как в свое время с auto_ptr.
Reply
Reply
Reply
Reply
Reply
Reply
Reply
Помимо языка, у rust уже есть замечательное коммьюнити и всякого рода инструменты и обвязки (например, чего только стоит rust-bindgen).
Reply
Leave a comment