Hi Sergiu,
Impressive work. Some one had to do this :)
I think XWiki slowness in lot of cases is a major issue.
2007/12/13, Sergiu Dumitriu <sergiu(a)xwiki.com>om>:
Hi,
I spent most of today profiling XWiki, and here is a summary of my findings.
First, I tested the following three situations:
(1) Creating many documents with 500 versions each, using XWiki 1.1
(2) Updating those documents to XWiki 1.2
(3) Creating many documents with 500 versions each, using XWiki 1.2
(1) spent most of the time in Hibernate and RCS. And by most, I mean
almost all time. For rcs, each new version required parsing all the
history, adding the new version, reserializing the history. And the RCS
implementation we're using (org.suigeneris.jrcs) seems very inefficient,
a lot of calls ending at charAt, substring, split. And since each update
requires sending all the history back, the rest of the time was spent in
hibernate, sending large strings to mysql. Creating one document with
all its 500 versions takes several minutes.
(2) spent most of the time doing one thing: parsing the old RCS archive.
Still, a lot less time was spent in Hibernate, about 2% of all the
execution time, as opposed to 80% in (1). Updating one 500 versions long
archive took 6 seconds. Updating a 300 version document takes 2 seconds,
while a document with one version is almost instantly updated.
(3) spends incredibly much less time in rcs, as expected (1% of all the
running time). So the new archive mechanism is a major performance
boost. Instead, most of the time is spent in saveBacklinks, which goes
to Radeox. This is even more serious, given the fact that the document
content was very small (200 random characters). I'd say that a major
flaw is that the backlinks gathering process uses the radeox engine with
all the filters and macros enabled, while all we need is the links
filter. Here, creating a document requires a few seconds (2-3).
From the remaining (little) time that is left, a big part is consumed
with document cloning. See
http://jira.xwiki.org/jira/browse/XWIKI-1950
for this. This is true both for XWiki 1.1 and 1.2.
On the database performance, beside the fact that Hibernate is slow, too
much time is spent on saveOrUpdate. It seems that instead of checking
the document object to see if it needs to be saved or updated, Hibernate
retrieves the document from the database and compares the retrieved
versions with the provided object to see if it is a new object that
needs to be inserter or an existing one that needs updating.
As a total for (3): 90% of the time is spent in saveDocument, of which
38% in saveLinks (most of which is spent in radeox), 22% in
hibernate.saveOrUpdate, 16% in hibernate.endTransaction (actual saving
of the document to the database) and 13% in updateArchive.
Thus, gathering backlinks with only one filter enabled will probably
reduce 35% of the running time, and improving the calls to saveOrUpdate
will give another 10-20%.
Remarks:
- This shows only the performance when saving documents, so I will need
another day to test the performance on view. I'd say that most of the
time will be spent in radeox, parsing the wiki content.
- As it is known, observing a process modifies it. All the numbers would
probably be (a little) different under real usage, without a profiler
sniffing everything.
Sergiu
_______________________________________________
devs mailing list
devs(a)xwiki.org
http://lists.xwiki.org/mailman/listinfo/devs