diff options
author | Mårten Nordheim <marten.nordheim@qt.io> | 2021-07-19 15:24:51 +0200 |
---|---|---|
committer | Mårten Nordheim <marten.nordheim@qt.io> | 2021-07-22 23:01:41 +0200 |
commit | 640c5ca088319d9a372072c180eef35c80a552e8 (patch) | |
tree | 1f4b473c70cd83367b0f041ec9ce6814fa455cda /tests/benchmarks | |
parent | 08411a3ddfe2a3a392b1520e1283ce12208ebcb9 (diff) |
Add benchmarks for QString::number
While we're here:
- remove the GCC precondition for compiling this benchmark.
Task-number: QTBUG-88484
Change-Id: I14f3ea7e4708e274d032a6297e9d4a87ae5dc1c0
Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
Diffstat (limited to 'tests/benchmarks')
-rw-r--r-- | tests/benchmarks/corelib/text/CMakeLists.txt | 4 | ||||
-rw-r--r-- | tests/benchmarks/corelib/text/qstring/tst_bench_qstring.cpp | 132 |
2 files changed, 133 insertions, 3 deletions
diff --git a/tests/benchmarks/corelib/text/CMakeLists.txt b/tests/benchmarks/corelib/text/CMakeLists.txt index 8942b898d0..d0a2373822 100644 --- a/tests/benchmarks/corelib/text/CMakeLists.txt +++ b/tests/benchmarks/corelib/text/CMakeLists.txt @@ -7,6 +7,4 @@ add_subdirectory(qstringbuilder) add_subdirectory(qstringlist) add_subdirectory(qstringtokenizer) add_subdirectory(qregularexpression) -if(GCC) - add_subdirectory(qstring) -endif() +add_subdirectory(qstring) diff --git a/tests/benchmarks/corelib/text/qstring/tst_bench_qstring.cpp b/tests/benchmarks/corelib/text/qstring/tst_bench_qstring.cpp index 054f52c214..0fe387154e 100644 --- a/tests/benchmarks/corelib/text/qstring/tst_bench_qstring.cpp +++ b/tests/benchmarks/corelib/text/qstring/tst_bench_qstring.cpp @@ -28,6 +28,7 @@ #include <QStringList> #include <QFile> #include <QTest> +#include <limits> class tst_QString: public QObject { @@ -48,9 +49,18 @@ private slots: void toCaseFolded_data(); void toCaseFolded(); + void number_qlonglong_data(); + void number_qlonglong() { number_impl<qlonglong>(); } + void number_qulonglong_data(); + void number_qulonglong() { number_impl<qulonglong>(); } + + void number_double_data(); + void number_double(); + private: void section_data_impl(bool includeRegExOnly = true); template <typename RX> void section_impl(); + template <typename Integer> void number_impl(); }; tst_QString::tst_QString() @@ -187,6 +197,128 @@ void tst_QString::toCaseFolded() } } +template <typename Integer> +void tst_QString::number_impl() +{ + QFETCH(Integer, number); + QFETCH(int, base); + QFETCH(QString, expected); + + QString actual; + QBENCHMARK { + actual = QString::number(number, base); + } + QCOMPARE(actual, expected); +} + +template <typename Integer> +void number_integer_common() +{ + QTest::newRow("0") << Integer(0ull) << 10 << QStringLiteral("0"); + QTest::newRow("1234") << Integer(1234ull) << 10 << QStringLiteral("1234"); + QTest::newRow("123456789") << Integer(123456789ull) << 10 << QStringLiteral("123456789"); + QTest::newRow("bad1dea, base 16") << Integer(0xBAD1DEAull) << 16 << QStringLiteral("bad1dea"); + QTest::newRow("242, base 8") << Integer(0242ull) << 8 << QStringLiteral("242"); + QTest::newRow("101101, base 2") << Integer(0b101101ull) << 2 << QStringLiteral("101101"); + QTest::newRow("ad, base 30") << Integer(313ull) << 30 << QStringLiteral("ad"); +} + +void tst_QString::number_qlonglong_data() +{ + QTest::addColumn<qlonglong>("number"); + QTest::addColumn<int>("base"); + QTest::addColumn<QString>("expected"); + + number_integer_common<qlonglong>(); + + QTest::newRow("-1234") << -1234ll << 10 << QStringLiteral("-1234"); + QTest::newRow("-123456789") << -123456789ll << 10 << QStringLiteral("-123456789"); + QTest::newRow("-bad1dea, base 16") << -0xBAD1DEAll << 16 << QStringLiteral("-bad1dea"); + QTest::newRow("-242, base 8") << -0242ll << 8 << QStringLiteral("-242"); + QTest::newRow("-101101, base 2") << -0b101101ll << 2 << QStringLiteral("-101101"); + QTest::newRow("-ad, base 30") << -313ll << 30 << QStringLiteral("-ad"); + + QTest::newRow("qlonglong-max") + << std::numeric_limits<qlonglong>::max() << 10 << QStringLiteral("9223372036854775807"); + QTest::newRow("qlonglong-min") + << std::numeric_limits<qlonglong>::min() << 10 + << QStringLiteral("-9223372036854775808"); + QTest::newRow("qlonglong-max, base 2") + << std::numeric_limits<qlonglong>::max() << 2 << QString(63, u'1'); + QTest::newRow("qlonglong-min, base 2") << std::numeric_limits<qlonglong>::min() << 2 + << (QStringLiteral("-1") + QString(63, u'0')); + QTest::newRow("qlonglong-max, base 16") + << std::numeric_limits<qlonglong>::max() << 16 << (QChar(u'7') + QString(15, u'f')); + QTest::newRow("qlonglong-min, base 16") << std::numeric_limits<qlonglong>::min() << 16 + << (QStringLiteral("-8") + QString(15, u'0')); +} + +void tst_QString::number_qulonglong_data() +{ + QTest::addColumn<qulonglong>("number"); + QTest::addColumn<int>("base"); + QTest::addColumn<QString>("expected"); + + number_integer_common<qulonglong>(); + + QTest::newRow("qlonglong-max + 1") + << (qulonglong(std::numeric_limits<qlonglong>::max()) + 1) << 10 + << QStringLiteral("9223372036854775808"); + QTest::newRow("qulonglong-max") + << std::numeric_limits<qulonglong>::max() << 10 + << QStringLiteral("18446744073709551615"); + QTest::newRow("qulonglong-max, base 2") + << std::numeric_limits<qulonglong>::max() << 2 << QString(64, u'1'); + QTest::newRow("qulonglong-max, base 16") + << std::numeric_limits<qulonglong>::max() << 16 << QString(16, u'f'); +} + +void tst_QString::number_double_data() +{ + QTest::addColumn<double>("number"); + QTest::addColumn<char>("format"); + QTest::addColumn<int>("precision"); + QTest::addColumn<QString>("expected"); + + struct + { + double d; + char f; + int p; + QString expected; + } data[] = { + { 0.0, 'f', 0, QStringLiteral("0") }, + { 0.0001, 'f', 0, QStringLiteral("0") }, + { 0.1234, 'f', 5, QStringLiteral("0.12340") }, + { -0.1234, 'f', 5, QStringLiteral("-0.12340") }, + { 0.5 + qSqrt(1.25), 'f', 15, QStringLiteral("1.618033988749895") }, + { std::numeric_limits<double>::epsilon(), 'g', 10, QStringLiteral("2.220446049e-16") }, + { 0.0001, 'E', 1, QStringLiteral("1.0E-04") }, + { 1e8, 'E', 1, QStringLiteral("1.0E+08") }, + { -1e8, 'E', 1, QStringLiteral("-1.0E+08") }, + }; + + for (auto &datum : data) { + QTest::addRow("%ls, format '%c', precision %d", qUtf16Printable(datum.expected), datum.f, + datum.p) + << datum.d << datum.f << datum.p << datum.expected; + } +} + +void tst_QString::number_double() +{ + QFETCH(double, number); + QFETCH(char, format); + QFETCH(int, precision); + QFETCH(QString, expected); + + QString actual; + QBENCHMARK { + actual = QString::number(number, format, precision); + } + QCOMPARE(actual, expected); +} + QTEST_APPLESS_MAIN(tst_QString) #include "tst_bench_qstring.moc" |