diff options
author | Robin Burchell <robin.burchell@collabora.com> | 2012-01-21 13:45:44 +0200 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-01-21 14:29:49 +0100 |
commit | 4ed85ba43fa50adacc4e47da6b5e70bad6f03d2e (patch) | |
tree | 0b21b203e65050fde884cbe4cad19e6a7bbd1280 | |
parent | 642155703e9d91db6229f3863b885104e49f0b61 (diff) |
Introduce a qalgorithms benchmark.
Based on the unit test for data production.
Change-Id: I88a411c0079b251d3682c3fbf9fe7ed1b5457a7e
Reviewed-by: Anselmo L. S. Melo <anselmo.melo@openbossa.org>
Reviewed-by: Richard J. Moore <rich@kde.org>
4 files changed, 147 insertions, 1 deletions
diff --git a/tests/benchmarks/corelib/tools/qalgorithms/.gitignore b/tests/benchmarks/corelib/tools/qalgorithms/.gitignore new file mode 100644 index 0000000000..379c13eb9b --- /dev/null +++ b/tests/benchmarks/corelib/tools/qalgorithms/.gitignore @@ -0,0 +1 @@ +tst_qalgorithms diff --git a/tests/benchmarks/corelib/tools/qalgorithms/qalgorithms.pro b/tests/benchmarks/corelib/tools/qalgorithms/qalgorithms.pro new file mode 100644 index 0000000000..0e6e830185 --- /dev/null +++ b/tests/benchmarks/corelib/tools/qalgorithms/qalgorithms.pro @@ -0,0 +1,4 @@ +CONFIG += testcase +TARGET = tst_qalgorithms +QT = core testlib +SOURCES = tst_qalgorithms.cpp diff --git a/tests/benchmarks/corelib/tools/qalgorithms/tst_qalgorithms.cpp b/tests/benchmarks/corelib/tools/qalgorithms/tst_qalgorithms.cpp new file mode 100644 index 0000000000..751c3e3ae4 --- /dev/null +++ b/tests/benchmarks/corelib/tools/qalgorithms/tst_qalgorithms.cpp @@ -0,0 +1,140 @@ +/**************************************************************************** +** +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Robin Burchell <robin+qt@viroteck.net> +** Contact: http://www.qt-project.org/ +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QtTest/QtTest> + +#include <iostream> +#include <iomanip> +#include <sstream> +#include <algorithm> +#include <qalgorithms.h> +#include <QStringList> +#include <QString> +#include <QVector> + +using namespace std; + +class tst_QAlgorithms : public QObject +{ + Q_OBJECT +private slots: + void stableSort_data(); + void stableSort(); + + void sort_data(); + void sort(); +}; + +template <typename DataType> +QVector<DataType> generateData(QString dataSetType, const int length) +{ + QVector<DataType> container; + if (dataSetType == "Random") { + for (int i = 0; i < length; ++i) + container.append(rand()); + } else if (dataSetType == "Ascending") { + for (int i = 0; i < length; ++i) + container.append(i); + } else if (dataSetType == "Descending") { + for (int i = 0; i < length; ++i) + container.append(length - i); + } else if (dataSetType == "Equal") { + for (int i = 0; i < length; ++i) + container.append(43); + } else if (dataSetType == "Duplicates") { + for (int i = 0; i < length; ++i) + container.append(i % 10); + } else if (dataSetType == "Almost Sorted") { + for (int i = 0; i < length; ++i) + container.append(i); + for (int i = 0; i<= length / 10; ++i) { + const int iswap = i * 9; + DataType tmp = container.at(iswap); + container[iswap] = container.at(iswap + 1); + container[iswap + 1] = tmp; + } + } + + return container; +} + +Q_DECLARE_METATYPE(QVector<int>) + +void tst_QAlgorithms::stableSort_data() +{ + const int dataSize = 5000; + QTest::addColumn<QVector<int> >("unsorted"); + QTest::newRow("Equal") << (generateData<int>("Equal", dataSize)); + QTest::newRow("Ascending") << (generateData<int>("Ascending", dataSize)); + QTest::newRow("Descending") << (generateData<int>("Descending", dataSize)); + QTest::newRow("Duplicates") << (generateData<int>("Duplicates", dataSize)); + QTest::newRow("Almost Sorted") << (generateData<int>("Almost Sorted", dataSize)); +} + +void tst_QAlgorithms::stableSort() +{ + QFETCH(QVector<int>, unsorted); + + QBENCHMARK { + QVector<int> sorted = unsorted; + qStableSort(sorted.begin(), sorted.end()); + } +} + +void tst_QAlgorithms::sort_data() +{ + stableSort_data(); +} + +void tst_QAlgorithms::sort() +{ + QFETCH(QVector<int>, unsorted); + + QBENCHMARK { + QVector<int> sorted = unsorted; + qSort(sorted.begin(), sorted.end()); + } +} + + +QTEST_MAIN(tst_QAlgorithms) +#include "tst_qalgorithms.moc" + diff --git a/tests/benchmarks/corelib/tools/tools.pro b/tests/benchmarks/corelib/tools/tools.pro index d5bf8301f9..ea9059e759 100644 --- a/tests/benchmarks/corelib/tools/tools.pro +++ b/tests/benchmarks/corelib/tools/tools.pro @@ -10,6 +10,7 @@ SUBDIRS = \ qstring \ qstringbuilder \ qstringlist \ - qvector + qvector \ + qalgorithms !*g++*: SUBDIRS -= qstring |