From 4ed85ba43fa50adacc4e47da6b5e70bad6f03d2e Mon Sep 17 00:00:00 2001 From: Robin Burchell Date: Sat, 21 Jan 2012 13:45:44 +0200 Subject: [PATCH] Introduce a qalgorithms benchmark. Based on the unit test for data production. Change-Id: I88a411c0079b251d3682c3fbf9fe7ed1b5457a7e Reviewed-by: Anselmo L. S. Melo Reviewed-by: Richard J. Moore --- .../corelib/tools/qalgorithms/.gitignore | 1 + .../corelib/tools/qalgorithms/qalgorithms.pro | 4 + .../corelib/tools/qalgorithms/tst_qalgorithms.cpp | 140 +++++++++++++++++++++ tests/benchmarks/corelib/tools/tools.pro | 3 +- 4 files changed, 147 insertions(+), 1 deletion(-) create mode 100644 tests/benchmarks/corelib/tools/qalgorithms/.gitignore create mode 100644 tests/benchmarks/corelib/tools/qalgorithms/qalgorithms.pro create mode 100644 tests/benchmarks/corelib/tools/qalgorithms/tst_qalgorithms.cpp diff --git a/tests/benchmarks/corelib/tools/qalgorithms/.gitignore b/tests/benchmarks/corelib/tools/qalgorithms/.gitignore new file mode 100644 index 0000000..379c13e --- /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 0000000..0e6e830 --- /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 0000000..751c3e3 --- /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 +** 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 + +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace std; + +class tst_QAlgorithms : public QObject +{ + Q_OBJECT +private slots: + void stableSort_data(); + void stableSort(); + + void sort_data(); + void sort(); +}; + +template +QVector generateData(QString dataSetType, const int length) +{ + QVector 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) + +void tst_QAlgorithms::stableSort_data() +{ + const int dataSize = 5000; + QTest::addColumn >("unsorted"); + QTest::newRow("Equal") << (generateData("Equal", dataSize)); + QTest::newRow("Ascending") << (generateData("Ascending", dataSize)); + QTest::newRow("Descending") << (generateData("Descending", dataSize)); + QTest::newRow("Duplicates") << (generateData("Duplicates", dataSize)); + QTest::newRow("Almost Sorted") << (generateData("Almost Sorted", dataSize)); +} + +void tst_QAlgorithms::stableSort() +{ + QFETCH(QVector, unsorted); + + QBENCHMARK { + QVector sorted = unsorted; + qStableSort(sorted.begin(), sorted.end()); + } +} + +void tst_QAlgorithms::sort_data() +{ + stableSort_data(); +} + +void tst_QAlgorithms::sort() +{ + QFETCH(QVector, unsorted); + + QBENCHMARK { + QVector 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 d5bf830..ea9059e 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 -- 2.7.4