История изменений
Исправление Siborgium, (текущая версия) :
Это не вопрос «веры».
Если бы оптимизация по хинту restrict работала, это приносило некоторую пользу в некоторых ситуациях. Небольшую, потому что модель компиляции Rust сходна, например, с крестовыми модулями, и анализатор в состоянии оценить тело функции самостоятельно.
Но она не работает. Она сломана в LLVM, и поэтому отключена в rustc.
И эксклюзивное владение x неэксклюзивное чтение в Rust никакого отношения к restrict не имеют, они появились из-за тотальной немощи borrow checker’а в анализ сколь-нибудь сложной модели владения. Впрочем, если анализатор неспособен выявить &mut
borrow на два заведомо разных элемента массива, ему уж точно не до моделей владения.
Еще ты не ответил на вторую часть моего сообщения. Так вот, в Rust по определению нет inplace construction, что приводит к смешным проблемам, в общем случае никак не решающимся, а передача всего и вся по значению приводит к огромному количеству memcpy (3-6% времени исполнения), которое также невозможно соптимизировать, не переделав полностью модель языка.
Количество изменений относительно С никак не гарантирует качество или производительность.
Исправление Siborgium, :
Это не вопрос «веры».
Если бы оптимизация по хинту restrict работала, это приносило некоторую пользу в некоторых ситуациях. Небольшую, потому что модель компиляции Rust сходна, например, с крестовыми модулями, и анализатор в состоянии оценить тело функции самостоятельно.
Но она не работает. Она сломана в LLVM, и поэтому отключена в rustc.
И эксклюзивное владение x неэксклюзивное чтение в Rust никакого отношения к restrict не имеют, они появились из-за тотальной немощи borrow checker’а в анализ сколь-нибудь сложной модели владения. Впрочем, если анализатор, неспособен выявить &mut
borrow на два заведомо разных элемента массива, ему уж точно не до моделей владения.
Еще ты не ответил на вторую часть моего сообщения. Так вот, в Rust по определению нет inplace construction, что приводит к смешным проблемам, в общем случае никак не решающимся, а передача всего и вся по значению приводит к огромному количеству memcpy (3-6% времени исполнения), которое также невозможно соптимизировать, не переделав полностью модель языка.
Количество изменений относительно С никак не гарантирует качество или производительность.
Исправление Siborgium, :
Это не вопрос «веры».
Если бы оптимизация по хинту restrict работала, это приносило некоторую пользу в некоторых ситуациях. Небольшую, потому что модель компиляции Rust сходна, например, с крестовыми модулями, и анализатор в состоянии оценить тело функции самостоятельно.
Но она не работает. Она сломана в LLVM, и поэтому отключена в rustc.
Еще ты не ответил на вторую часть моего сообщения. Так вот, в Rust по определению нет inplace construction, что приводит к смешным проблемам, в общем случае никак не решающимся, а передача всего и вся по значению приводит к огромному количеству memcpy (3-6% времени исполнения), которое также невозможно соптимизировать, не переделав полностью модель языка.
Количество изменений относительно С никак не гарантирует качество или производительность.
Исправление Siborgium, :
Это не вопрос «веры».
Если бы оптимизация по хинту restrict работала, это приносило некоторую пользу в некоторых ситуациях. Небольшую, потому что модель компиляции Rust сходна, например, с крестовыми модулями, и анализатор в состоянии оценить тело функции самостоятельно.
Но она не работает. Она сломана в LLVM, и поэтому отключена в rustc.
Еще ты не ответил на вторую часть моего сообщения. Так вот, в Rust по определению нет inplace construction, что приводит к смешным проблемам, в общем случае никак не решающимся, а передача всего и вся по значению приводит к огромному количеству memcpy (3-6% времени исполнения), которое также невозможно соптимизировать, не переделав полностью модель языка.
Исходная версия Siborgium, :
Это не вопрос «веры».
Если бы оптимизация по хинту restrict работала, это приносило некоторую пользу в некоторых ситуациях. Небольшую, потому что модель компиляции Rust сходна, например, с крестовыми модулями, и анализатор в состоянии оценить тело функции самостоятельно.
Но она не работает. Она сломана в LLVM, и поэтому отключена в rustc.
Еще ты не ответил на вторую часть моего сообщения. Так вот, в Rust по определению нет inplace construction, что приводит к смешным проблемам, в общем случае никак не решающимся [1], а передача всего и вся по значению приводит к огромному количеству memcpy (3-6% времени исполнения) [2], которое также невозможно соптимизировать, не переделав полностью модель языка [3].
[1] https://github.com/rust-lang/rust/issues/28008 [2] https://github.com/rust-lang/rust/issues/64301 [3] https://internals.rust-lang.org/t/defer-memcpy-when-passing-types-that-is-copy-until-it-is-actually-moved-to-another-variable/17022/3