diff options
author | Qt Continuous Integration System <qt-info@nokia.com> | 2010-02-19 11:57:58 (GMT) |
---|---|---|
committer | Qt Continuous Integration System <qt-info@nokia.com> | 2010-02-19 11:57:58 (GMT) |
commit | 477bf4379b0eb7b9a44f4730ce9b8fc07a8e635e (patch) | |
tree | fef39cfe5893d8203d34ffa41d914ce210703f94 /tests/benchmarks | |
parent | 7e7cbe2152efe47972e11875f008ddb8f0cc78db (diff) | |
parent | c3f85f9f3a15c7e880d1d2b10ef6b98881f7f87c (diff) | |
download | Qt-477bf4379b0eb7b9a44f4730ce9b8fc07a8e635e.zip Qt-477bf4379b0eb7b9a44f4730ce9b8fc07a8e635e.tar.gz Qt-477bf4379b0eb7b9a44f4730ce9b8fc07a8e635e.tar.bz2 |
Merge branch 'master' of scm.dev.nokia.troll.no:qt/oslo-staging-2 into master-integration
* 'master' of scm.dev.nokia.troll.no:qt/oslo-staging-2: (126 commits)
Skip OpenGL threading tests on Mac as they were causing reboots
Fixed compile of autotests.
Fix warnings on gcc
Add experimental VBO support for drawCachedGlyphs()'s index array
Fix threaded gl autotest build failure on GLES2
Removed redundant debug output from trace benchmark.
Added two QML based traces to trace benchmark.
Fixed old trace files no longer working.
Reduced the memory footprint of qttrace files.
Added trace replayer benchmark.
Added --range and --single arguments to qttracereplay.
Always accept values reported directly using QTest::setBenchmarkResult.
Make threading use-cases work for X11
Run firstRun initialization in declarative/painting benchmark
Optimization for text drawing on OpenGL
Enable QStaticText in QtDeclarative painting benchmark
Fix no-webkit compiler helpviewer
Make sure height of glyph cache is a power of two
Fixes crash when destroying a QGraphicsItem.
Move benchmarks/qvector to benchmarks/corelib/tools/qvector
...
Diffstat (limited to 'tests/benchmarks')
16 files changed, 292 insertions, 12 deletions
diff --git a/tests/benchmarks/qvector/main.cpp b/tests/benchmarks/corelib/tools/qvector/main.cpp index 6393eda..6393eda 100644 --- a/tests/benchmarks/qvector/main.cpp +++ b/tests/benchmarks/corelib/tools/qvector/main.cpp diff --git a/tests/benchmarks/qvector/outofline.cpp b/tests/benchmarks/corelib/tools/qvector/outofline.cpp index e8d036e..e8d036e 100644 --- a/tests/benchmarks/qvector/outofline.cpp +++ b/tests/benchmarks/corelib/tools/qvector/outofline.cpp diff --git a/tests/benchmarks/qvector/qrawvector.h b/tests/benchmarks/corelib/tools/qvector/qrawvector.h index 1824d20..1824d20 100644 --- a/tests/benchmarks/qvector/qrawvector.h +++ b/tests/benchmarks/corelib/tools/qvector/qrawvector.h diff --git a/tests/benchmarks/qvector/qvector.pro b/tests/benchmarks/corelib/tools/qvector/qvector.pro index adb30c9..adb30c9 100644 --- a/tests/benchmarks/qvector/qvector.pro +++ b/tests/benchmarks/corelib/tools/qvector/qvector.pro diff --git a/tests/benchmarks/corelib/tools/tools.pro b/tests/benchmarks/corelib/tools/tools.pro index 12c23fc..681a6c6 100644 --- a/tests/benchmarks/corelib/tools/tools.pro +++ b/tests/benchmarks/corelib/tools/tools.pro @@ -7,4 +7,5 @@ SUBDIRS = \ qregexp \ qstring \ qstringbuilder \ - qstringlist + qstringlist \ + qvector diff --git a/tests/benchmarks/declarative/painting/paintbenchmark.cpp b/tests/benchmarks/declarative/painting/paintbenchmark.cpp index d6a873c..dd52740 100644 --- a/tests/benchmarks/declarative/painting/paintbenchmark.cpp +++ b/tests/benchmarks/declarative/painting/paintbenchmark.cpp @@ -48,10 +48,7 @@ #include <QVBoxLayout> #include <QTime> #include <QDebug> - -#ifdef HAVE_STATICTEXT -#include <private/qstatictext_p.h> -#endif +#include <QStaticText> int iterations = 20; const int count = 600; @@ -105,7 +102,6 @@ void paint_QTextLayout_cache(QPainter &p) paint_QTextLayout(p, true); } -#ifdef HAVE_STATICTEXT void paint_QStaticText(QPainter &p, bool useOptimizations) { static QStaticText *staticText[lines]; @@ -113,7 +109,10 @@ void paint_QStaticText(QPainter &p, bool useOptimizations) if (first) { for (int i = 0; i < lines; ++i) { staticText[i] = new QStaticText(strings[i]); - staticText[i]->setUseBackendOptimizations(useOptimizations); + if (useOptimizations) + staticText[i]->setPerformanceHint(QStaticText::AggressiveCaching); + else + staticText[i]->setPerformanceHint(QStaticText::ModerateCaching); } first = false; } @@ -133,7 +132,6 @@ void paint_QStaticText_optimizations(QPainter &p) { paint_QStaticText(p, true); } -#endif void paint_QPixmapCachedText(QPainter &p) { @@ -203,10 +201,8 @@ struct { } funcs[] = { { "QTextLayoutNoCache", &paint_QTextLayout_noCache }, { "QTextLayoutWithCache", &paint_QTextLayout_cache }, -#ifdef HAVE_STATICTEXT { "QStaticTextNoBackendOptimizations", &paint_QStaticText_noOptimizations }, { "QStaticTextWithBackendOptimizations", &paint_QStaticText_optimizations }, -#endif { "CachedText", &paint_QPixmapCachedText }, { "RoundedRect", &paint_RoundedRect }, { "CachedRoundedRect", &paint_QPixmapCachedRoundedRect }, @@ -231,7 +227,7 @@ public: void paintEvent(QPaintEvent *) { static int last = 0; static bool firstRun = true; - if (firstRun == 0) { + if (firstRun) { timer.start(); firstRun = false; } else { diff --git a/tests/benchmarks/gui/painting/painting.pro b/tests/benchmarks/gui/painting/painting.pro index 878567d..2c042b5 100644 --- a/tests/benchmarks/gui/painting/painting.pro +++ b/tests/benchmarks/gui/painting/painting.pro @@ -2,4 +2,5 @@ TEMPLATE = subdirs SUBDIRS = \ qpainter \ qregion \ - qtransform + qtransform \ + qtracebench diff --git a/tests/benchmarks/gui/painting/qtracebench/qtracebench.pro b/tests/benchmarks/gui/painting/qtracebench/qtracebench.pro new file mode 100644 index 0000000..56ec8bb --- /dev/null +++ b/tests/benchmarks/gui/painting/qtracebench/qtracebench.pro @@ -0,0 +1,10 @@ +load(qttest_p4) +TEMPLATE = app +TARGET = tst_qtracebench + +INCLUDEPATH += . $$QT_SOURCE_TREE/src/3rdparty/harfbuzz/src + +RESOURCES += qtracebench.qrc + +SOURCES += tst_qtracebench.cpp + diff --git a/tests/benchmarks/gui/painting/qtracebench/qtracebench.qrc b/tests/benchmarks/gui/painting/qtracebench/qtracebench.qrc new file mode 100644 index 0000000..5569550 --- /dev/null +++ b/tests/benchmarks/gui/painting/qtracebench/qtracebench.qrc @@ -0,0 +1,10 @@ +<RCC> + <qresource> + <file>traces/basicdrawing.trace</file> + <file>traces/webkit.trace</file> + <file>traces/textedit.trace</file> + <file>traces/creator.trace</file> + <file>traces/qmlphoneconcept.trace</file> + <file>traces/qmlsamegame.trace</file> + </qresource> +</RCC> diff --git a/tests/benchmarks/gui/painting/qtracebench/traces/basicdrawing.trace b/tests/benchmarks/gui/painting/qtracebench/traces/basicdrawing.trace Binary files differnew file mode 100644 index 0000000..0241d08 --- /dev/null +++ b/tests/benchmarks/gui/painting/qtracebench/traces/basicdrawing.trace diff --git a/tests/benchmarks/gui/painting/qtracebench/traces/creator.trace b/tests/benchmarks/gui/painting/qtracebench/traces/creator.trace Binary files differnew file mode 100644 index 0000000..55ee9e1 --- /dev/null +++ b/tests/benchmarks/gui/painting/qtracebench/traces/creator.trace diff --git a/tests/benchmarks/gui/painting/qtracebench/traces/qmlphoneconcept.trace b/tests/benchmarks/gui/painting/qtracebench/traces/qmlphoneconcept.trace Binary files differnew file mode 100644 index 0000000..835ebfa --- /dev/null +++ b/tests/benchmarks/gui/painting/qtracebench/traces/qmlphoneconcept.trace diff --git a/tests/benchmarks/gui/painting/qtracebench/traces/qmlsamegame.trace b/tests/benchmarks/gui/painting/qtracebench/traces/qmlsamegame.trace Binary files differnew file mode 100644 index 0000000..1d76195 --- /dev/null +++ b/tests/benchmarks/gui/painting/qtracebench/traces/qmlsamegame.trace diff --git a/tests/benchmarks/gui/painting/qtracebench/traces/textedit.trace b/tests/benchmarks/gui/painting/qtracebench/traces/textedit.trace Binary files differnew file mode 100644 index 0000000..998716d --- /dev/null +++ b/tests/benchmarks/gui/painting/qtracebench/traces/textedit.trace diff --git a/tests/benchmarks/gui/painting/qtracebench/traces/webkit.trace b/tests/benchmarks/gui/painting/qtracebench/traces/webkit.trace Binary files differnew file mode 100644 index 0000000..43e752d --- /dev/null +++ b/tests/benchmarks/gui/painting/qtracebench/traces/webkit.trace diff --git a/tests/benchmarks/gui/painting/qtracebench/tst_qtracebench.cpp b/tests/benchmarks/gui/painting/qtracebench/tst_qtracebench.cpp new file mode 100644 index 0000000..ff2633d --- /dev/null +++ b/tests/benchmarks/gui/painting/qtracebench/tst_qtracebench.cpp @@ -0,0 +1,262 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <qtest.h> + +#include <QtGui> + +#include <private/qpaintengineex_p.h> +#include <private/qpaintbuffer_p.h> + +//TESTED_FILES= + +class ReplayWidget : public QWidget +{ + Q_OBJECT +public: + ReplayWidget(const QString &filename); + + void paintEvent(QPaintEvent *event); + void resizeEvent(QResizeEvent *event); + + bool done() const { return m_done; } + qreal result() const { return m_result; } + +public slots: + void updateRect(); + +public: + QList<QRegion> updates; + QPaintBuffer buffer; + + int currentFrame; + int currentIteration; + QTime timer; + + QList<uint> visibleUpdates; + QList<uint> iterationTimes; + QString filename; + + bool m_done; + qreal m_result; + + uint m_total; +}; + +void ReplayWidget::updateRect() +{ + if (!visibleUpdates.isEmpty()) + update(updates.at(visibleUpdates.at(currentFrame))); +} + +void ReplayWidget::paintEvent(QPaintEvent *) +{ + if (m_done) + return; + + QPainter p(this); + + // if partial updates don't work + // p.setClipRegion(frames.at(currentFrame).updateRegion); + + buffer.draw(&p, visibleUpdates.at(currentFrame)); + + ++currentFrame; + if (currentFrame >= visibleUpdates.size()) { + currentFrame = 0; + ++currentIteration; + + uint currentElapsed = timer.isNull() ? 0 : timer.elapsed(); + timer.restart(); + + m_total += currentElapsed; + + // warm up for at most 5 iterations or half a second + if (currentIteration >= 5 || m_total >= 500) { + iterationTimes << currentElapsed; + + if (iterationTimes.size() >= 5) { + qreal mean = 0; + qreal stddev = 0; + uint min = INT_MAX; + + for (int i = 0; i < iterationTimes.size(); ++i) { + mean += iterationTimes.at(i); + min = qMin(min, iterationTimes.at(i)); + } + + mean /= qreal(iterationTimes.size()); + + for (int i = 0; i < iterationTimes.size(); ++i) { + qreal delta = iterationTimes.at(i) - mean; + stddev += delta * delta; + } + + stddev = qSqrt(stddev / iterationTimes.size()); + + qSort(iterationTimes.begin(), iterationTimes.end()); + uint median = iterationTimes.at(iterationTimes.size() / 2); + + stddev = 100 * stddev / mean; + // do 100 iterations, break earlier if we spend more than 5 seconds or have a low std deviation after 2 seconds + if (iterationTimes.size() >= 100 || m_total >= 5000 || (m_total >= 2000 && stddev < 4)) { + printf("%s, iterations: %d, frames: %d, min(ms): %d, median(ms): %d, stddev: %f %%, max(fps): %f\n", qPrintable(filename), + iterationTimes.size(), visibleUpdates.size(), min, median, stddev, 1000. * visibleUpdates.size() / min); + m_result = min; + m_done = true; + return; + } + } + } + } +} + +void ReplayWidget::resizeEvent(QResizeEvent *event) +{ + visibleUpdates.clear(); + + QRect bounds = rect(); + for (int i = 0; i < updates.size(); ++i) { + if (updates.at(i).intersects(bounds)) + visibleUpdates << i; + } + + if (visibleUpdates.size() != updates.size()) + printf("Warning: skipped %d frames due to limited resolution\n", updates.size() - visibleUpdates.size()); + +} + +ReplayWidget::ReplayWidget(const QString &filename_) + : currentFrame(0) + , currentIteration(0) + , filename(filename_) + , m_done(false) + , m_result(0) + , m_total(0) +{ + setWindowTitle(filename); + QFile file(filename); + + if (!file.open(QIODevice::ReadOnly)) { + printf("Failed to load input file '%s'\n", qPrintable(filename_)); + return; + } + + QDataStream in(&file); + + char *data; + uint size; + in.readBytes(data, size); + bool isTraceFile = size >= 7 && qstrncmp(data, "qttrace", 7) == 0; + uint version = 0; + if (size == 9 && qstrncmp(data, "qttraceV2", 9) == 0) { + in.setFloatingPointPrecision(QDataStream::SinglePrecision); + in >> version; + } + + delete [] data; + if (!isTraceFile) { + printf("File '%s' is not a trace file\n", qPrintable(filename_)); + return; + } + + in >> buffer >> updates; + + resize(buffer.boundingRect().size().toSize()); + + setAutoFillBackground(false); + setAttribute(Qt::WA_NoSystemBackground); +} + + +class tst_QTraceBench : public QObject +{ + Q_OBJECT + +private slots: + void trace(); + void trace_data(); +}; + +static const QLatin1String prefix(":/traces/"); + +void tst_QTraceBench::trace_data() +{ + QTest::addColumn<QString>("filename"); + + QTest::newRow("basicdrawing") << (prefix + "basicdrawing.trace"); + QTest::newRow("webkit") << (prefix + "webkit.trace"); + QTest::newRow("creator") << (prefix + "creator.trace"); + QTest::newRow("textedit") << (prefix + "textedit.trace"); + QTest::newRow("qmlphoneconcept") << (prefix + "qmlphoneconcept.trace"); + QTest::newRow("qmlsamegame") << (prefix + "qmlsamegame.trace"); +} + +void tst_QTraceBench::trace() +{ + QFETCH(QString, filename); + + QFile file(filename); + if (!file.exists()) { + qWarning() << "Missing file" << filename; + return; + } + + ReplayWidget widget(filename); + + if (widget.updates.isEmpty()) { + qWarning() << "No trace updates" << filename; + return; + } + + widget.show(); + QTest::qWaitForWindowShown(&widget); + + while (!widget.done()) { + widget.updateRect(); + QApplication::processEvents(); + } + + QTest::setBenchmarkResult(widget.result(), QTest::WalltimeMilliseconds); +} + +QTEST_MAIN(tst_QTraceBench) +#include "tst_qtracebench.moc" |