diff options
author | Milian Wolff <milian.wolff@kdab.com> | 2012-09-03 18:06:17 +0200 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-09-05 03:02:59 +0200 |
commit | 0102f34f1ebe91aaff6fb2edc83a7ebf7ffb4d1e (patch) | |
tree | 8e2b3e7fc3549e69be6d089c19692f881b20b66b /tests/benchmarks | |
parent | 3fe5715b9a46ba13137b21d5ea8288ac8b538268 (diff) |
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>
Diffstat (limited to 'tests/benchmarks')
-rw-r--r-- | tests/benchmarks/gui/text/qtext/main.cpp | 43 |
1 files changed, 35 insertions, 8 deletions
diff --git a/tests/benchmarks/gui/text/qtext/main.cpp b/tests/benchmarks/gui/text/qtext/main.cpp index 5a4745fbc7..8188a01b3e 100644 --- a/tests/benchmarks/gui/text/qtext/main.cpp +++ b/tests/benchmarks/gui/text/qtext/main.cpp @@ -51,6 +51,7 @@ #include <qtest.h> Q_DECLARE_METATYPE(QTextDocument*) +Q_DECLARE_METATYPE(QList<QTextLayout::FormatRange>) class tst_QText: public QObject { @@ -80,6 +81,7 @@ private slots: void layout_data(); void layout(); + void formattedLayout_data(); void formattedLayout(); void paintLayoutToPixmap(); void paintLayoutToPixmap_painterFill(); @@ -328,28 +330,53 @@ void tst_QText::layout() } }*/ -void tst_QText::formattedLayout() +void tst_QText::formattedLayout_data() { - //set up formatting - QList<QTextLayout::FormatRange> ranges; + QTest::addColumn<QString>("text"); + QTest::addColumn<QList<QTextLayout::FormatRange> >("ranges"); + + QTextCharFormat format; + format.setForeground(QColor("steelblue")); + { - QTextCharFormat format; - format.setForeground(QColor("steelblue")); + QList<QTextLayout::FormatRange> ranges; QTextLayout::FormatRange formatRange; formatRange.format = format; formatRange.start = 0; formatRange.length = 50; - ranges.append(formatRange); + + QTest::newRow("short-single") << m_shortLorem << ranges; + } + { + QList<QTextLayout::FormatRange> ranges; + + QString text = m_lorem.repeated(100); + const int width = 1; + for (int i = 0; i < text.size(); i += width) { + QTextLayout::FormatRange formatRange; + formatRange.format.setForeground(QBrush(QColor(i % 255, 255, 255))); + formatRange.start = i; + formatRange.length = width; + ranges.append(formatRange); + } + + QTest::newRow("long-many") << m_shortLorem << ranges; } +} - QTextLayout layout(m_shortLorem); +void tst_QText::formattedLayout() +{ + QFETCH(QString, text); + QFETCH(QList<QTextLayout::FormatRange>, ranges); + + QTextLayout layout(text); layout.setAdditionalFormats(ranges); setupTextLayout(&layout); QBENCHMARK { - QTextLayout layout(m_shortLorem); + QTextLayout layout(text); layout.setAdditionalFormats(ranges); setupTextLayout(&layout); } |