Optimize QTextLayout/QTextEngine usage outside of QTextDocument.
authorMilian Wolff <milian.wolff@kdab.com>
Mon, 3 Sep 2012 16:06:17 +0000 (18:06 +0200)
committerQt by Nokia <qt-info@nokia.com>
Wed, 5 Sep 2012 01:02:59 +0000 (03:02 +0200)
commit0102f34f1ebe91aaff6fb2edc83a7ebf7ffb4d1e
tree8e2b3e7fc3549e69be6d089c19692f881b20b66b
parent3fe5715b9a46ba13137b21d5ea8288ac8b538268
Optimize QTextLayout/QTextEngine usage outside of QTextDocument.

When QTextLayout is used in a QTextDocument, many code paths use
special caches and thus greatly outperform the raw QTextLayout version
that operates directly on a QString.

This patch brings some of these optimizations also to the raw version.
We now also use a QFormatCollection in such cases and enable the
functionality of QTextEngine::indexAdditionalFormats() and
QTextEngine::resolveAdditionalFormats(). Thanks to that, we can greatly
speed up QTextEngine::format(), which now uses an amort O(1) hash table
lookup instead of a O(N) linear search.

The added benchmark shows a gain in the order of one magnitude:

./tst_bench_QText formattedLayout:long-many

before applying the patch:
378.19 msecs per iteration (total: 37,820, iterations: 100)
after applying the patch:
25.80 msecs per iteration (total: 2,580, iterations: 100)

Note: This change is source-incompatible for applications using the private
QTextEngine API.

Task-number: QTBUG-8389
Change-Id: Ifcf7a8902a394428979ea06a6d955f886ee739c7
Reviewed-by: Konstantin Ritt <ritt.ks@gmail.com>
Reviewed-by: Olivier Goffart <ogoffart@woboq.com>
Reviewed-by: Lars Knoll <lars.knoll@nokia.com>
src/gui/text/qtextengine.cpp
src/gui/text/qtextengine_p.h
tests/benchmarks/gui/text/qtext/main.cpp