Size: a a a

2020 July 15

BD

Berkus Decker in Rust Async
Mikail Bagishov
То есть отслеживать лайфтайм мьютекса не выйдет.
Но хотя бы можно не дать использовать данные без залоканного мьютекса.
я первым делом растовский мьютекс для плюсовой скодобазы заимплементил, сразу стало меньше “забытых” доступов без лока
источник

В

Вафель in Rust Async
Kai Ren
Семантика вьедается в мозги ппц
+

теперь без борроу чекера/овнершипа некомфортно
источник

MB

Mikail Bagishov in Rust Async
Berkus Decker
я первым делом растовский мьютекс для плюсовой скодобазы заимплементил, сразу стало меньше “забытых” доступов без лока
При этом интересный момент.
Плюсовый RWLock может давать константную ссылку в rlock() и мутабельную в wlock().
Гошный нет, потому что в го нет константных ссылок.
Таким образом в C++ можно иметь более безопасные примитивы синхронизации, чем в го.
источник

D

Denis in Rust Async
Aleksandr Kravtsov
Добрый день джентельмены, есть такой вопрос, вот пишу веб на актикс-веб, решил сделать DI контейнер вот таким образом

pub struct DI {
   services: HashMap<TypeId, Arc<dyn Any + Send + Sync>>,
   params: HashMap<String, Arc<dyn Any + Send + Sync>>,
}


в него можно положить и достать сервис указав его тип

вопрсо такой, правильно ли я делаю заворачивая всё в Arc? если не заворачивать то DI не передаётся в

App::new()
   .data(di.clone())
задумался на тем какой перформанс кост у этого дела. сервсы у меня в реквест хендлерах вытаскиваются,

context
   .di
   .service::<AuthService>()
   .login(&username, &password)


метод вытаскивания сервиса вот такой

pub fn service<T: 'static + Send + Sync + Dependency>(&self) -> Arc<T> {
   self.services
       .get(&TypeId::of::<T>())
       .unwrap_or_else(|| panic!(format!("No service `{}` found in DI container", T::service_name())))
       .clone()
       .downcast()
       .unwrap()
}


получается это единственное место где у Арка увеличивается его счётчик и как я понимаю он там как то атомарно увеличивается.. это медленнее чем неатомарно и по этому поводу у меня есть некоторое беспокойство.. а как у вас?
> задумался на тем какой перформанс кост у этого дела

сделай бенч, это же так просто:
https://gist.github.com/mexus/4a8fcaff64c4c0bbc1b027770d9aa979
источник

D

Denis in Rust Async
источник

AK

Aleksandr Kravtsov in Rust Async
Denis
> задумался на тем какой перформанс кост у этого дела

сделай бенч, это же так просто:
https://gist.github.com/mexus/4a8fcaff64c4c0bbc1b027770d9aa979
делаю 🙂
источник

D

Denis in Rust Async
.. но я уже сделал.. ))
источник

D

Denis in Rust Async
11.5 наносекунд на клон
источник

d

diabolo in Rust Async
Denis
11.5 наносекунд на клон
это засада 😉🤣😂
источник

D

Denis in Rust Async
diabolo
это засада 😉🤣😂
кстати я раньше это дело не бенчал и думал, что там будет буквально пара наносекунд ))
источник

d

diabolo in Rust Async
Denis
кстати я раньше это дело не бенчал и думал, что там будет буквально пара наносекунд ))
cpu target native
источник

D

Denis in Rust Async
diabolo
cpu target native
ничё не меняет :(
источник

d

diabolo in Rust Async
Denis
ничё не меняет :(
хм, странно...
источник

d

diabolo in Rust Async
по идее не больше пяти должно быть
источник

BD

Berkus Decker in Rust Async
diabolo
хм, странно...
атомарный инкремент счетчика одинаково делается везде вроде как
источник

d

diabolo in Rust Async
Berkus Decker
атомарный инкремент счетчика одинаково делается везде вроде как
не не, он немного разный для натив и не натив, в этом и кривизна x86_64
источник

d

diabolo in Rust Async
ща буду эксперименты ставить)
источник

BD

Berkus Decker in Rust Async
diabolo
не не, он немного разный для натив и не натив, в этом и кривизна x86_64
хммм, хочу асм посмотреть
источник

d

diabolo in Rust Async
Berkus Decker
хммм, хочу асм посмотреть
ну так посмотри, код наверху)
источник

В

Вафель in Rust Async
Хм, а tokio_codec вообще пригоден для zero-copy? Я ожидал что Decoder будет аля serde::Deserialize:

pub trait Decoder<'de> {
   type Item;
   type Error: From<io::Error>;

   fn decode(&mut self, src: &'de mut BytesMut) -> Result<Option<Self::Item>, Self::Error>;
}

(Что позволило бы Item боровить из src)

Но ничего подобного в токио нет (лайфтайма в Decoder)
источник