From 3b0cddd36801703d67ab1d9a2405ad9afc5431a4 Mon Sep 17 00:00:00 2001 From: mathieui Date: Sat, 27 Jun 2015 22:39:15 +0200 Subject: Micro-optimize the roster refresh The roster wrapper sucks and is way too slow. Halve refresh time by more than 50% using manually managed counters. --- src/core/handlers.py | 7 ++++++- src/roster.py | 17 ++++++++--------- 2 files changed, 14 insertions(+), 10 deletions(-) (limited to 'src') diff --git a/src/core/handlers.py b/src/core/handlers.py index f2df9a70..00e64ba8 100644 --- a/src/core/handlers.py +++ b/src/core/handlers.py @@ -867,7 +867,11 @@ def on_got_offline(self, presence): # If a resource got offline, display the message in the conversation with this # precise resource. contact = roster[jid.bare] - name = contact.name if contact and contact.name else jid.bare + name = jid.bare + if contact: + roster.connected -= 1 + if contact.name: + name = contact.name if jid.resource: self.add_information_message_to_conversation_tab(jid.full, '\x195}%s is \x191}offline' % name) self.add_information_message_to_conversation_tab(jid.bare, '\x195}%s is \x191}offline' % name) @@ -887,6 +891,7 @@ def on_got_online(self, presence): if contact is None: # Todo, handle presence coming from contacts not in roster return + roster.connected += 1 roster.modified() if not logger.log_roster_change(jid.bare, 'got online'): self.information('Unable to write in the log file', 'Error') diff --git a/src/roster.py b/src/roster.py index d2b99cef..7866655f 100644 --- a/src/roster.py +++ b/src/roster.py @@ -40,6 +40,8 @@ class Roster(object): section='var').split(':')) self.groups = {} self.contacts = {} + self.length = 0 + self.connected = 0 # Used for caching roster infos self.last_built = datetime.now() @@ -104,11 +106,12 @@ class Roster(object): return self.__node.jid def get_and_set(self, jid): - if not jid in self.contacts: + contact = self.contacts.get(jid) + if contact is None: contact = Contact(self.__node[jid]) self.contacts[jid] = contact return contact - return self.contacts[jid] + return contact def set_node(self, value): """Set the slixmpp RosterSingle for our roster""" @@ -146,6 +149,7 @@ class Roster(object): contact = self.get_and_set(key) if key != self.jid and (contact and self.exists(contact)): l.append(key) + self.length = len(l) return l def get_contacts(self): @@ -190,11 +194,7 @@ class Roster(object): """ Get the number of connected contacts """ - n = 0 - for contact in self: - if self.exists(contact) and len(contact): - n += 1 - return n + return self.connected def update_contact_groups(self, contact): """Regenerate the RosterGroups when receiving a contact update""" @@ -219,7 +219,7 @@ class Roster(object): (used to return the display size, but now we have the display cache in RosterWin for that) """ - return len(self.jids()) + return self.length def __repr__(self): ret = '== Roster:\nContacts:\n' @@ -244,7 +244,6 @@ class Roster(object): except OSError: return - def exists(self, contact): if not contact: return False -- cgit v1.2.3