Add benchmarks for QString number parsing
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 <thiago.macieira@intel.com> Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
This commit is contained in:
parent
28d9f05fa1
commit
7fef433004
@ -5,6 +5,8 @@
|
||||
#include <QTest>
|
||||
#include <limits>
|
||||
|
||||
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<qlonglong>(); }
|
||||
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 <typename RX> void section_impl();
|
||||
@ -189,6 +200,10 @@ void tst_QString::number_impl()
|
||||
template <typename Integer>
|
||||
void number_integer_common()
|
||||
{
|
||||
QTest::addColumn<Integer>("number");
|
||||
QTest::addColumn<int>("base");
|
||||
QTest::addColumn<QString>("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<qlonglong>("number");
|
||||
QTest::addColumn<int>("base");
|
||||
QTest::addColumn<QString>("expected");
|
||||
|
||||
number_integer_common<qlonglong>();
|
||||
|
||||
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<qulonglong>("number");
|
||||
QTest::addColumn<int>("base");
|
||||
QTest::addColumn<QString>("expected");
|
||||
|
||||
number_integer_common<qulonglong>();
|
||||
|
||||
QTest::newRow("qlonglong-max + 1")
|
||||
@ -294,6 +301,155 @@ void tst_QString::number_double()
|
||||
QCOMPARE(actual, expected);
|
||||
}
|
||||
|
||||
template <typename Integer>
|
||||
void toWholeCommon_data()
|
||||
{
|
||||
QTest::addColumn<QString>("text");
|
||||
QTest::addColumn<int>("base");
|
||||
QTest::addColumn<bool>("good");
|
||||
QTest::addColumn<Integer>("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<qlonglong>();
|
||||
|
||||
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<qlonglong>::max();
|
||||
QTest::newRow("qlonglong-min")
|
||||
<< u"-9223372036854775808"_s << 10 << true
|
||||
<< std::numeric_limits<qlonglong>::min();
|
||||
QTest::newRow("qlonglong-max, base 2")
|
||||
<< QString(63, u'1') << 2 << true << std::numeric_limits<qlonglong>::max();
|
||||
QTest::newRow("qlonglong-min, base 2")
|
||||
<< (u"-1"_s + QString(63, u'0')) << 2 << true
|
||||
<< std::numeric_limits<qlonglong>::min();
|
||||
QTest::newRow("qlonglong-max, base 16")
|
||||
<< (QChar(u'7') + QString(15, u'f')) << 16 << true
|
||||
<< std::numeric_limits<qlonglong>::max();
|
||||
QTest::newRow("qlonglong-min, base 16")
|
||||
<< (u"-8"_s + QString(15, u'0')) << 16 << true
|
||||
<< std::numeric_limits<qlonglong>::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<qulonglong>();
|
||||
|
||||
QTest::newRow("qlonglong-max + 1")
|
||||
<< u"9223372036854775808"_s << 10 << true
|
||||
<< (qulonglong(std::numeric_limits<qlonglong>::max()) + 1);
|
||||
QTest::newRow("qulonglong-max")
|
||||
<< u"18446744073709551615"_s << 10 << true
|
||||
<< std::numeric_limits<qulonglong>::max();
|
||||
QTest::newRow("qulonglong-max, base 2")
|
||||
<< QString(64, u'1') << 2 << true << std::numeric_limits<qulonglong>::max();
|
||||
QTest::newRow("qulonglong-max, base 16")
|
||||
<< QString(16, u'f') << 16 << true << std::numeric_limits<qulonglong>::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<QString>("text");
|
||||
QTest::addColumn<bool>("good");
|
||||
QTest::addColumn<double>("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<double>::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"
|
||||
|
Loading…
Reference in New Issue
Block a user