From 3befcec672bab72cdfd2d99ae3cc1725b25e952e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C4=9Bj=20Laitl?= Date: Wed, 7 Aug 2024 15:46:39 +0200 Subject: [PATCH] Try to use dashmap This fixes the performance regression for me, but we need to think whether that's worth the dependency tradeoff. --- Cargo.toml | 1 + src/lib.rs | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 872c92a..61eac38 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,6 +15,7 @@ keywords = ["actor", "threads"] flume = { version = "0.10", default-features = false, features = ["select"] } log = "0.4" parking_lot = "0.12" +dashmap = "6" [dev-dependencies] anyhow = "1" diff --git a/src/lib.rs b/src/lib.rs index c109437..6153511 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -233,7 +233,7 @@ struct EventSubscribers { events: HashMap>, /// We cache the last published value of each event type. /// Subscribers can request to receive it upon subscription. - last_value_cache: HashMap>, + last_value_cache: dashmap::DashMap>, } /// Contains the "metadata" of the system, including information about the registry @@ -778,7 +778,7 @@ impl SystemHandle { /// When sending to some subscriber fails, others are still tried and vec of errors is returned. /// For direct, non-[`Clone`] or high-throughput messages please use [`Addr`] or [`Recipient`]. pub fn publish(&self, event: E) -> Result<(), PublishError> { - let mut event_subscribers = self.event_subscribers.write(); + let event_subscribers = self.event_subscribers.read(); let type_id = TypeId::of::(); event_subscribers.last_value_cache.insert(type_id, Box::new(event.clone()));