From 7fef433004f7ebde47c1ac80d98c6abac82f2eea Mon Sep 17 00:00:00 2001 From: Edward Welbourne Date: Wed, 2 Nov 2022 11:06:30 +0100 Subject: Add benchmarks for QString number parsing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Based on the tests for QString::number(), but run in reverse, with some embelishments. Also moved some shared code from number_*_data() to their shared number_integer_common template. Pick-to: 6.4 6.2 5.15 Change-Id: I74e7082372166c3cdbcd6bcbc31f9003e07cbcbc Reviewed-by: Thiago Macieira Reviewed-by: MÃ¥rten Nordheim --- .../corelib/text/qstring/tst_bench_qstring.cpp | 172 ++++++++++++++++++++- 1 file changed, 164 insertions(+), 8 deletions(-) (limited to 'tests/benchmarks') diff --git a/tests/benchmarks/corelib/text/qstring/tst_bench_qstring.cpp b/tests/benchmarks/corelib/text/qstring/tst_bench_qstring.cpp index f63f92463b..4d2eaafd28 100644 --- a/tests/benchmarks/corelib/text/qstring/tst_bench_qstring.cpp +++ b/tests/benchmarks/corelib/text/qstring/tst_bench_qstring.cpp @@ -5,6 +5,8 @@ #include #include +using namespace Qt::StringLiterals; + class tst_QString: public QObject { Q_OBJECT @@ -24,6 +26,7 @@ private slots: void toCaseFolded_data(); void toCaseFolded(); + // Serializing: void number_qlonglong_data(); void number_qlonglong() { number_impl(); } void number_qulonglong_data(); @@ -32,6 +35,14 @@ private slots: void number_double_data(); void number_double(); + // Parsing: + void toLongLong_data(); + void toLongLong(); + void toULongLong_data(); + void toULongLong(); + void toDouble_data(); + void toDouble(); + private: void section_data_impl(bool includeRegExOnly = true); template void section_impl(); @@ -189,6 +200,10 @@ void tst_QString::number_impl() template void number_integer_common() { + QTest::addColumn("number"); + QTest::addColumn("base"); + QTest::addColumn("expected"); + QTest::newRow("0") << Integer(0ull) << 10 << QStringLiteral("0"); QTest::newRow("1234") << Integer(1234ull) << 10 << QStringLiteral("1234"); QTest::newRow("123456789") << Integer(123456789ull) << 10 << QStringLiteral("123456789"); @@ -200,10 +215,6 @@ void number_integer_common() void tst_QString::number_qlonglong_data() { - QTest::addColumn("number"); - QTest::addColumn("base"); - QTest::addColumn("expected"); - number_integer_common(); QTest::newRow("-1234") << -1234ll << 10 << QStringLiteral("-1234"); @@ -230,10 +241,6 @@ void tst_QString::number_qlonglong_data() void tst_QString::number_qulonglong_data() { - QTest::addColumn("number"); - QTest::addColumn("base"); - QTest::addColumn("expected"); - number_integer_common(); QTest::newRow("qlonglong-max + 1") @@ -294,6 +301,155 @@ void tst_QString::number_double() QCOMPARE(actual, expected); } +template +void toWholeCommon_data() +{ + QTest::addColumn("text"); + QTest::addColumn("base"); + QTest::addColumn("good"); + QTest::addColumn("expected"); + + QTest::newRow("empty") << u""_s << 10 << false << Integer(0ull); + QTest::newRow("0") << u"0"_s << 10 << true << Integer(0ull); + QTest::newRow("1234") << u"1234"_s << 10 << true << Integer(1234ull); + QTest::newRow("1,234") << u"1,234"_s << 10 << false << Integer(0ull); + QTest::newRow("123456789") + << u"123456789"_s << 10 << true << Integer(123456789ull); + QTest::newRow("bad1dea, base 16") + << u"bad1dea"_s << 16 << true << Integer(0xBAD1DEAull); + QTest::newRow("bad1dea, base 10") << u"bad1dea"_s << 10 << false << Integer(0ull); + QTest::newRow("42, base 13") << u"42"_s << 13 << true << Integer(6ull * 9ull); + QTest::newRow("242, base 8") << u"242"_s << 8 << true << Integer(0242ull); + QTest::newRow("495, base 8") << u"495"_s << 8 << false << Integer(0ull); + QTest::newRow("101101, base 2") + << u"101101"_s << 2 << true << Integer(0b101101ull); + QTest::newRow("ad, base 30") << u"ad"_s << 30 << true << Integer(313ull); +} + +void tst_QString::toLongLong_data() +{ + toWholeCommon_data(); + + QTest::newRow("-1234") << u"-1234"_s << 10 << true << -1234ll; + QTest::newRow("-123456789") << u"-123456789"_s << 10 << true << -123456789ll; + QTest::newRow("-bad1dea, base 16") << u"-bad1dea"_s << 16 << true << -0xBAD1DEAll; + QTest::newRow("-242, base 8") << u"-242"_s << 8 << true << -0242ll; + QTest::newRow("-101101, base 2") << u"-101101"_s << 2 << true << -0b101101ll; + QTest::newRow("-ad, base 30") << u"-ad"_s << 30 << true << -313ll; + + QTest::newRow("qlonglong-max") + << u"9223372036854775807"_s << 10 << true + << std::numeric_limits::max(); + QTest::newRow("qlonglong-min") + << u"-9223372036854775808"_s << 10 << true + << std::numeric_limits::min(); + QTest::newRow("qlonglong-max, base 2") + << QString(63, u'1') << 2 << true << std::numeric_limits::max(); + QTest::newRow("qlonglong-min, base 2") + << (u"-1"_s + QString(63, u'0')) << 2 << true + << std::numeric_limits::min(); + QTest::newRow("qlonglong-max, base 16") + << (QChar(u'7') + QString(15, u'f')) << 16 << true + << std::numeric_limits::max(); + QTest::newRow("qlonglong-min, base 16") + << (u"-8"_s + QString(15, u'0')) << 16 << true + << std::numeric_limits::min(); +} + +void tst_QString::toLongLong() +{ + QFETCH(QString, text); + QFETCH(int, base); + QFETCH(bool, good); + QFETCH(qlonglong, expected); + + qlonglong actual = expected; + bool ok = false; + QBENCHMARK { + actual = text.toLongLong(&ok, base); + } + QCOMPARE(ok, good); + QCOMPARE(actual, expected); +} + +void tst_QString::toULongLong_data() +{ + toWholeCommon_data(); + + QTest::newRow("qlonglong-max + 1") + << u"9223372036854775808"_s << 10 << true + << (qulonglong(std::numeric_limits::max()) + 1); + QTest::newRow("qulonglong-max") + << u"18446744073709551615"_s << 10 << true + << std::numeric_limits::max(); + QTest::newRow("qulonglong-max, base 2") + << QString(64, u'1') << 2 << true << std::numeric_limits::max(); + QTest::newRow("qulonglong-max, base 16") + << QString(16, u'f') << 16 << true << std::numeric_limits::max(); +} + +void tst_QString::toULongLong() +{ + QFETCH(QString, text); + QFETCH(int, base); + QFETCH(bool, good); + QFETCH(qulonglong, expected); + + qulonglong actual = expected; + bool ok = false; + QBENCHMARK { + actual = text.toULongLong(&ok, base); + } + QCOMPARE(ok, good); + QCOMPARE(actual, expected); +} + +void tst_QString::toDouble_data() +{ + QTest::addColumn("text"); + QTest::addColumn("good"); + QTest::addColumn("expected"); + + QTest::newRow("empty") << u""_s << false << 0.0; + QTest::newRow("0") << u"0"_s << true << 0.0; + QTest::newRow("0.12340") << u"0.12340"_s << true << 0.12340; + QTest::newRow("-0.12340") << u"-0.12340"_s << true << -0.12340; + QTest::newRow("epsilon") + << u"2.220446049e-16"_s << true << std::numeric_limits::epsilon(); + QTest::newRow("1.0e-4") << u"1.0e-4"_s << true << 1.0e-4; + QTest::newRow("1.0e+4") << u"1.0e+4"_s << true << 1.0e+4; + QTest::newRow("10.e+3") << u"10.e+3"_s << true << 1.0e+4; + QTest::newRow("10e+3.") << u"10e+3."_s << false << 0.0; + QTest::newRow("1e4") << u"1e4"_s << true << 1.0e+4; + QTest::newRow("1.0e-8") << u"1.0e-8"_s << true << 1.0e-8; + QTest::newRow("1.0e+8") << u"1.0e+8"_s << true << 1.0e+8; + + // NaN and infinity: + QTest::newRow("nan") << u"nan"_s << true << qQNaN(); + QTest::newRow("NaN") << u"NaN"_s << true << qQNaN(); + QTest::newRow("-nan") << u"-nan"_s << false << 0.0; + QTest::newRow("+nan") << u"+nan"_s << false << 0.0; + QTest::newRow("inf") << u"inf"_s << true << qInf(); + QTest::newRow("Inf") << u"Inf"_s << true << qInf(); + QTest::newRow("+inf") << u"+inf"_s << true << qInf(); + QTest::newRow("-inf") << u"-inf"_s << true << -qInf(); +} + +void tst_QString::toDouble() +{ + QFETCH(QString, text); + QFETCH(bool, good); + QFETCH(double, expected); + + double actual = expected; + bool ok = false; + QBENCHMARK { + actual = text.toDouble(&ok); + } + QCOMPARE(ok, good); + QCOMPARE(actual, expected); +} + QTEST_APPLESS_MAIN(tst_QString) #include "tst_bench_qstring.moc" -- cgit v1.2.3