Pre-compute JID bare and full forms, and store that in each JID.

This wins about 4s over a 54s real-world benchmark.
This commit is contained in:
Emmanuel Gil Peyrot 2016-08-21 20:36:54 +01:00
parent 52cd8f4b22
commit ab6df235d7

View File

@ -299,7 +299,7 @@ class JID:
:raises InvalidJID: :raises InvalidJID:
""" """
__slots__ = ('_node', '_domain', '_resource') __slots__ = ('_node', '_domain', '_resource', '_bare', '_full')
def __init__(self, jid=None): def __init__(self, jid=None):
if not jid: if not jid:
@ -312,6 +312,8 @@ class JID:
self._node = jid._node self._node = jid._node
self._domain = jid._domain self._domain = jid._domain
self._resource = jid._resource self._resource = jid._resource
self._bare = _format_jid(self._node, self._domain)
self._full = _format_jid(self._node, self._domain, self._resource)
def unescape(self): def unescape(self):
"""Return an unescaped JID object. """Return an unescaped JID object.
@ -362,43 +364,57 @@ class JID:
@property @property
def bare(self): def bare(self):
return _format_jid(self._node, self._domain) return self._bare
@property @property
def full(self): def full(self):
return _format_jid(self._node, self._domain, self._resource) return self._full
@property @property
def jid(self): def jid(self):
return _format_jid(self._node, self._domain, self._resource) return self._full
@node.setter @node.setter
def node(self, value): def node(self, value):
self._node = _validate_node(value) self._node = _validate_node(value)
self._bare = _format_jid(self._node, self._domain)
self._full = _format_jid(self._node, self._domain, self._resource)
@user.setter @user.setter
def user(self, value): def user(self, value):
self._node = _validate_node(value) self._node = _validate_node(value)
self._bare = _format_jid(self._node, self._domain)
self._full = _format_jid(self._node, self._domain, self._resource)
@local.setter @local.setter
def local(self, value): def local(self, value):
self._node = _validate_node(value) self._node = _validate_node(value)
self._bare = _format_jid(self._node, self._domain)
self._full = _format_jid(self._node, self._domain, self._resource)
@username.setter @username.setter
def username(self, value): def username(self, value):
self._node = _validate_node(value) self._node = _validate_node(value)
self._bare = _format_jid(self._node, self._domain)
self._full = _format_jid(self._node, self._domain, self._resource)
@domain.setter @domain.setter
def domain(self, value): def domain(self, value):
self._domain = _validate_domain(value) self._domain = _validate_domain(value)
self._bare = _format_jid(self._node, self._domain)
self._full = _format_jid(self._node, self._domain, self._resource)
@server.setter @server.setter
def server(self, value): def server(self, value):
self._domain = _validate_domain(value) self._domain = _validate_domain(value)
self._bare = _format_jid(self._node, self._domain)
self._full = _format_jid(self._node, self._domain, self._resource)
@host.setter @host.setter
def host(self, value): def host(self, value):
self._domain = _validate_domain(value) self._domain = _validate_domain(value)
self._bare = _format_jid(self._node, self._domain)
self._full = _format_jid(self._node, self._domain, self._resource)
@bare.setter @bare.setter
def bare(self, value): def bare(self, value):
@ -406,26 +422,33 @@ class JID:
assert not resource assert not resource
self._node = node self._node = node
self._domain = domain self._domain = domain
self._bare = _format_jid(self._node, self._domain)
self._full = _format_jid(self._node, self._domain, self._resource)
@resource.setter @resource.setter
def resource(self, value): def resource(self, value):
self._resource = _validate_resource(value) self._resource = _validate_resource(value)
self._full = _format_jid(self._node, self._domain, self._resource)
@full.setter @full.setter
def full(self, value): def full(self, value):
self._node, self._domain, self._resource = _parse_jid(value) self._node, self._domain, self._resource = _parse_jid(value)
self._bare = _format_jid(self._node, self._domain)
self._full = _format_jid(self._node, self._domain, self._resource)
@jid.setter @jid.setter
def jid(self, value): def jid(self, value):
self._node, self._domain, self._resource = _parse_jid(value) self._node, self._domain, self._resource = _parse_jid(value)
self._bare = _format_jid(self._node, self._domain)
self._full = _format_jid(self._node, self._domain, self._resource)
def __str__(self): def __str__(self):
"""Use the full JID as the string value.""" """Use the full JID as the string value."""
return _format_jid(self._node, self._domain, self._resource) return self._full
def __repr__(self): def __repr__(self):
"""Use the full JID as the representation.""" """Use the full JID as the representation."""
return _format_jid(self._node, self._domain, self._resource) return self._full
# pylint: disable=W0212 # pylint: disable=W0212
def __eq__(self, other): def __eq__(self, other):
@ -445,4 +468,4 @@ class JID:
def __hash__(self): def __hash__(self):
"""Hash a JID based on the string version of its full JID.""" """Hash a JID based on the string version of its full JID."""
return hash(_format_jid(self._node, self._domain, self._resource)) return hash(self._full)