Size: a a a

Rust — русскоговорящее сообществo

2020 September 12

OA

Oleg Andreev in Rust — русскоговорящее сообществo
Vladimir
Особенно критично на ноутах, где просто можно в тротлинг уйти
Это была спец машина для бенчмарков
источник

V

Vladimir in Rust — русскоговорящее сообществo
Надо было ещё проверить sse2 но с районом.
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
Vladimir
У района вроде ж можно было это тюнить? Я помню ещё в первой версии квиксорта была оптимизация для последних пачек
Там всё равно происходит в конце сбор всех данных сначала в вектор, а потом уже куда ты сказал
источник

V

Vladimir in Rust — русскоговорящее сообществo
Emmanuel Goldstein
Там всё равно происходит в конце сбор всех данных сначала в вектор, а потом уже куда ты сказал
Разве? Там же параллельный итератор не по мутабельным слайсам?
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
Vladimir
Разве? Там же параллельный итератор не по мутабельным слайсам?
.collect() там реализован с лишней аллокацией
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
Потому что rayon гарантирует сохранение порядка элементов
источник

E

EternalKnight in Rust — русскоговорящее сообществo
всем привет
источник

V

Vladimir in Rust — русскоговорящее сообществo
Emmanuel Goldstein
.collect() там реализован с лишней аллокацией
Есть такое input.par_iter_mut() .for_each(|p| *p += 1);
источник

V

Vladimir in Rust — русскоговорящее сообществo
И ещё collect_into_vec
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
https://docs.rs/rayon/1.4.0/src/rayon/iter/extend.rs.html#12
Вот так там это реализовано
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
Внутри связный список из векторов
Соответственно, получается неэффективный проход по связному списку и отдельные аллокации на эти самые вектора
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
https://docs.rs/rayon/1.4.0/src/rayon/iter/extend.rs.html#25
И вот тут, собственно, происходит сам сбор
Причём даже не используется Vec::with_capacity и не переиспользуются вектора, т. е. это в реальности будет медленно
источник

V

Vladimir in Rust — русскоговорящее сообществo
Ну логично что екстенд в список кидает
источник

V

Vladimir in Rust — русскоговорящее сообществo
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
Vladimir
Ну логично что екстенд в список кидает
Он создаёт связный список векторов, даже если нам в итоге нужен, скажем, хешмап.
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
То есть это +O(N) аллоцированной памяти, +O(N) алллокаций и потом неэффективный проход по этому списку
источник

V

Vladimir in Rust — русскоговорящее сообществo
Я говорю про то, что ты нашел конкретную реализацию которая работает с листом, для вектора есть другая, и также есть обобщенная
источник

NL

Nick Linker in Rust — русскоговорящее сообществo
XÆA-XII
Я сейчас пишу очень сложный TUI)))
Ну кстати, есть специальная библиотека для таких занятий:
https://github.com/fdehau/tui-rs
источник

OA

Oleg Andreev in Rust — русскоговорящее сообществo
Vladimir
Особенно критично на ноутах, где просто можно в тротлинг уйти
вот у AVX без всяких ноутов есть троттлинг. Причем на несколько инструкций (десяткой инструкций?) вперед после того, как ты потрогал AVX. Так что если у тебя смешанная нагрузка, то векторные операции могут в результате обойтись дороже.
источник

OA

Oleg Andreev in Rust — русскоговорящее сообществo
в нашем случае 99% нагрузки было на AVX, так что юзкейс прекрасный. Но если 100 независимых пруфов попытаться запараллелить районом - сразу просир, потому что каждый пруф - 1 мс.
источник