2011-05-14 16:18:54 +00:00
|
|
|
= libpsyc Performance Benchmarks =
|
|
|
|
|
|
|
|
In this document we present the results of performance benchmarks
|
|
|
|
of libpsyc compared with libjson-glib and libxml2.
|
|
|
|
|
|
|
|
== Procedure ==
|
|
|
|
|
|
|
|
We'll use typical messages from the XMPP ("stanzas" in Jabber
|
2011-05-14 17:22:24 +00:00
|
|
|
lingo) and compare them with equivalent JSON encodings,
|
|
|
|
verbose and compact PSYC formats.
|
2011-05-14 16:18:54 +00:00
|
|
|
|
|
|
|
In some cases we will additionally compare PSYC packets to
|
|
|
|
a more efficient XML encoding based on PSYC methods, to have
|
|
|
|
a more accurate comparison of the actual PSYC and XML
|
|
|
|
syntaxes, rather than the protocol structures of PSYC and XMPP.
|
|
|
|
|
|
|
|
== Caveats ==
|
|
|
|
|
|
|
|
In every case we'll compare performance of parsing and re-rendering
|
|
|
|
these messages, but consider also that the applicative processing
|
|
|
|
of an XML DOM tree is more complicated than just accessing
|
|
|
|
certain elements in a JSON data structure or PSYC variable
|
|
|
|
mapping.
|
|
|
|
|
|
|
|
For a speed check in real world conditions which also consider the
|
|
|
|
complexity of processing incoming messages we should compare
|
|
|
|
the performance of a chat client using the two protocols,
|
|
|
|
for instance by using libpurple with XMPP and PSYC accounts.
|
|
|
|
To this purpose we first need to integrate libpsyc into libpurple.
|
|
|
|
|
|
|
|
== The Benchmarks ==
|
|
|
|
|
|
|
|
=== A presence packet ===
|
|
|
|
|
|
|
|
Since presence packets are by far the dominant messaging content
|
|
|
|
in the XMPP network, we'll start with one of them.
|
2011-05-14 17:22:24 +00:00
|
|
|
Here's an example from paragraph 4.4.2 of RFC 6121.
|
2011-05-14 16:18:54 +00:00
|
|
|
|
2011-05-14 17:22:24 +00:00
|
|
|
{{{
|
|
|
|
<presence from='juliet@example.com/balcony'
|
|
|
|
to='benvolio@example.net'>
|
|
|
|
<show>away</show>
|
|
|
|
</presence>
|
2011-05-14 16:18:54 +00:00
|
|
|
|
2011-05-14 17:22:24 +00:00
|
|
|
}}}
|
2011-05-14 16:18:54 +00:00
|
|
|
|
2011-05-14 17:22:24 +00:00
|
|
|
And here's the same information in a JSON rendition:
|
|
|
|
|
|
|
|
{{{
|
|
|
|
... <insert jsonRender>
|
|
|
|
}}}
|
|
|
|
|
|
|
|
Here's the equivalent PSYC packet in verbose form
|
|
|
|
(since it is a multicast, the single recipients do not
|
|
|
|
need to be mentioned):
|
|
|
|
|
|
|
|
{{{
|
|
|
|
:_context psyc://example.com/~juliet
|
|
|
|
|
|
|
|
=_degree_availability 4
|
|
|
|
_notice_presence
|
|
|
|
|
|
|
|
|
}}}
|
|
|
|
|
|
|
|
And the same in compact form:
|
|
|
|
|
|
|
|
{{{
|
|
|
|
:c psyc://example.com/~juliet
|
|
|
|
|
|
|
|
=da 4
|
|
|
|
np
|
|
|
|
|
|
|
|
|
}}}
|
2011-05-14 16:18:54 +00:00
|
|
|
|
|
|
|
=== An average chat message ===
|
|
|
|
=== A social network activity ===
|
|
|
|
=== A message with JSON-unfriendly characters ===
|
|
|
|
=== A message with XML-unfriendly characters ===
|
|
|
|
=== A packet containing a JPEG photograph ===
|
|
|
|
|
2011-05-14 17:22:24 +00:00
|
|
|
=== A random data structure ===
|
|
|
|
|
|
|
|
In this test we'll not consider XMPP at all and simply compare the
|
|
|
|
efficiency of the three syntaxes at serializing a typical user data base
|
|
|
|
storage information. We'll again start with XML:
|
|
|
|
|
|
|
|
{{{
|
|
|
|
<UserProfile>
|
|
|
|
<Name>Silvio Berlusconi</Name>
|
|
|
|
<JobTitle>Premier</JobTitle>
|
|
|
|
<Country>I</Country>
|
|
|
|
<Address>
|
|
|
|
<Street>Via del Colosseo, 1</Street>
|
|
|
|
<PostalCode>00100</PostalCode>
|
|
|
|
<City>Roma</City>
|
|
|
|
</Address>
|
|
|
|
<Page>http://example.org</Page>
|
|
|
|
</UserProfile>
|
|
|
|
}}}
|
|
|
|
|
|
|
|
In JSON this would look like this:
|
|
|
|
|
|
|
|
{{{
|
|
|
|
... <insert json rendering of DOM tree?>
|
|
|
|
}}}
|
|
|
|
|
|
|
|
Here's a way to model this in PSYC:
|
|
|
|
|
|
|
|
{{{
|
|
|
|
:_name Silvio Berlusconi
|
|
|
|
:_title_job Premier
|
|
|
|
:_country I
|
|
|
|
:_address_street Via del Colosseo, 1
|
|
|
|
:_address_code_postal 00100
|
|
|
|
:_address_city Roma
|
|
|
|
:_page http://example.org
|
|
|
|
_profile_user
|
|
|
|
|
|
|
|
|
}}}
|
|
|
|
|
|
|
|
== Conclusions ==
|
|
|
|
|
|
|
|
== Criticism ==
|
|
|
|
|
|
|
|
Are we comparing apples and oranges? Yes and no, depends on what you
|
|
|
|
need. XML is a syntax best suited for complex structured data in
|
|
|
|
well-defined formats - especially good for text mark-up. JSON is a syntax
|
|
|
|
intended to hold arbitrarily structured data suitable for immediate
|
|
|
|
inclusion in javascript source codes. The PSYC syntax is an evolved
|
|
|
|
derivate of RFC 822, the syntax used by HTTP and E-Mail, and is therefore
|
|
|
|
limited in the kind and depth of data structures that can be represented
|
|
|
|
with it, but in exchange it is highly performant at doing just that.
|
|
|
|
|
|
|
|
So it is up to you to find out which of the three formats fulfils your
|
|
|
|
requirements the best. We use PSYC for the majority of messaging where
|
|
|
|
JSON and XMPP aren't efficient and opaque enough, but we employ XML and
|
|
|
|
JSON as payloads within PSYC for data that doesn't fit the PSYC model.
|
|
|
|
For some reason all three formats are being used for messaging, although
|
|
|
|
only PSYC was actually designed for that purpose.
|
|
|
|
|