Size: a a a

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

2020 September 16

MS

Mikola Summer Duck in RU Rust GameDev — русскоговорящее сообщество
https://vorner.github.io/2020/09/03/performance-cheating.html
Хорошая статья про перформанс.
источник

R

Roman in RU Rust GameDev — русскоговорящее сообщество
Я похожий трюк использовал с bumpallo и rayon. На тредпул создавал по арене и использовал внутренний индекс треда, что б выбрать арену.
источник

R

Roman in RU Rust GameDev — русскоговорящее сообщество
Собственно тогда вообще мьютекс не нужен. Но unsafe код присутствует
источник

RA

Roman Akberov in RU Rust GameDev — русскоговорящее сообщество
А бумпало все еще делает memcpy на каждую аллокацию?
источник

R

Roman in RU Rust GameDev — русскоговорящее сообщество
Что именно он memcpy-л?
источник

R

Roman in RU Rust GameDev — русскоговорящее сообщество
Если ты используешь Box::new_in, или Bump::alloc, то значение будет memcpy-ровано в аллоцированный блок, но там других функций хватает
источник

RA

Roman Akberov in RU Rust GameDev — русскоговорящее сообщество
Ну типа я сделал арену на 10мб, выделил в ней массив на 5мб. У меня будет memcpy на 5 мегабайт, хотя память уже есть, и бамп аллокатору достаточно, собственно, бампануть указатель. Или я не прав?
источник

MS

Mikola Summer Duck in RU Rust GameDev — русскоговорящее сообщество
Roman Akberov
Ну типа я сделал арену на 10мб, выделил в ней массив на 5мб. У меня будет memcpy на 5 мегабайт, хотя память уже есть, и бамп аллокатору достаточно, собственно, бампануть указатель. Или я не прав?
Неправ.
источник

MS

Mikola Summer Duck in RU Rust GameDev — русскоговорящее сообщество
Такое сработает только с MaybeUninit
источник

R

Roman in RU Rust GameDev — русскоговорящее сообщество
Если ты пытаешься аллоцировать '[u8; 5 242 880]' то их еще проинициализировать надо
источник

MS

Mikola Summer Duck in RU Rust GameDev — русскоговорящее сообщество
Иначе он обязан инициализировать.
источник

R

Roman in RU Rust GameDev — русскоговорящее сообщество
Можно без memcpy, если ты аллоцируешь слайс из итератора, который выплюнет 5 мегабайт нулей. Будет memset :)
источник

R

Roman in RU Rust GameDev — русскоговорящее сообщество
Если не повезет, то 5 миллионов мемсетов
источник

R

Roman in RU Rust GameDev — русскоговорящее сообщество
В любом случае арены не заточены под крупные аллокации. Они для hot-path с кучкой мелких аллокаций
источник

RA

Roman Akberov in RU Rust GameDev — русскоговорящее сообщество
Ну зачем-то же есть https://docs.rs/bumpalo/3.4.0/src/bumpalo/lib.rs.html#623-653 с комментариями вида "очень надеемся, что llvm это соптимизирует" :)
источник

R

Roman in RU Rust GameDev — русскоговорящее сообщество
Ну это только если ты создаешь значение на месте. Однако какая-то запись в память все равно будет
источник

R

Roman in RU Rust GameDev — русскоговорящее сообщество
Будь то memcpy, memset или прямо инструкции для записи в память
источник

R

Roman in RU Rust GameDev — русскоговорящее сообщество
Разве что паддинг байты могут быть пропущены
источник

RA

Roman Akberov in RU Rust GameDev — русскоговорящее сообщество
Но при создании сначала на стеке-то будет, условно говоря, memset + memcpy вместо только memset. В общем, без гарантированного placement new остается только "надеяться на оптимизации llvm".
источник

R

Roman in RU Rust GameDev — русскоговорящее сообщество
Та же проблема и у Box::new. И вообще любого safe аллокатора
источник