From 3a07a17e9d0b75411ccbf96c8d9b39337c4a5d9c Mon Sep 17 00:00:00 2001 From: Jonas Platte Date: Fri, 10 Jul 2020 21:24:01 +0200 Subject: [PATCH 1/2] Remove unnecessary calls to clone() --- matrix_sdk_base/src/models/message.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/matrix_sdk_base/src/models/message.rs b/matrix_sdk_base/src/models/message.rs index a798ae8d..7f4532ef 100644 --- a/matrix_sdk_base/src/models/message.rs +++ b/matrix_sdk_base/src/models/message.rs @@ -32,9 +32,9 @@ pub struct MessageWrapper(pub SyncMessageEvent); impl MessageWrapper { pub fn clone_into_any_content(event: &AnyMessageEventStub) -> SyncMessageEvent { MessageEventStub { - content: event.content().clone(), + content: event.content(), sender: event.sender().clone(), - origin_server_ts: event.origin_server_ts().clone(), + origin_server_ts: *event.origin_server_ts(), event_id: event.event_id().clone(), unsigned: event.unsigned().clone(), } From 3ee06be87b84e9978f9ebae88561f6c4285551d9 Mon Sep 17 00:00:00 2001 From: Jonas Platte Date: Fri, 10 Jul 2020 21:41:46 +0200 Subject: [PATCH 2/2] Rewrite MessageQueue deserialization to reduce allocations --- matrix_sdk_base/src/models/message.rs | 34 ++++++++++++++++++++------- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/matrix_sdk_base/src/models/message.rs b/matrix_sdk_base/src/models/message.rs index 7f4532ef..d1431e6c 100644 --- a/matrix_sdk_base/src/models/message.rs +++ b/matrix_sdk_base/src/models/message.rs @@ -139,20 +139,38 @@ impl IntoIterator for MessageQueue { } pub(crate) mod ser_deser { + use std::fmt; + use super::*; + struct MessageQueueDeserializer; + + impl<'de> de::Visitor<'de> for MessageQueueDeserializer { + type Value = MessageQueue; + + fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + formatter.write_str("an array of message events") + } + + fn visit_seq(self, mut access: S) -> Result + where + S: de::SeqAccess<'de>, + { + let mut msgs = Vec::with_capacity(access.size_hint().unwrap_or(0)); + + while let Some(msg) = access.next_element::()? { + msgs.push(MessageWrapper(msg)); + } + + Ok(MessageQueue { msgs }) + } + } + pub fn deserialize<'de, D>(deserializer: D) -> Result where D: de::Deserializer<'de>, { - let messages: Vec = de::Deserialize::deserialize(deserializer)?; - - let mut msgs = vec![]; - for msg in messages { - msgs.push(MessageWrapper(msg)); - } - - Ok(MessageQueue { msgs }) + deserializer.deserialize_seq(MessageQueueDeserializer) } pub fn serialize(msgs: &MessageQueue, serializer: S) -> Result