From 03e794b7a6ce730c8768b91e00fefc6db32463be Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Thu, 14 Aug 2014 10:06:14 +0200 Subject: Add benchmark for QString::section() Change-Id: I7ca4ceb8cfa7a3df384400a1b3ebc9be2502e396 Reviewed-by: Giuseppe D'Angelo --- tests/benchmarks/corelib/tools/qstring/main.cpp | 58 +++++++++++++++++++++++++ 1 file changed, 58 insertions(+) (limited to 'tests/benchmarks/corelib/tools/qstring/main.cpp') diff --git a/tests/benchmarks/corelib/tools/qstring/main.cpp b/tests/benchmarks/corelib/tools/qstring/main.cpp index 64dfad82c9..2cd41280f1 100644 --- a/tests/benchmarks/corelib/tools/qstring/main.cpp +++ b/tests/benchmarks/corelib/tools/qstring/main.cpp @@ -40,18 +40,76 @@ class tst_QString: public QObject public: tst_QString(); private slots: + void section_regexp_data() { section_data_impl(); } + void section_regexp() { section_impl(); } + void section_regularexpression_data() { section_data_impl(); } + void section_regularexpression() { section_impl(); } + void section_string_data() { section_data_impl(false); } + void section_string() { section_impl(); } + void toUpper_data(); void toUpper(); void toLower_data(); void toLower(); void toCaseFolded_data(); void toCaseFolded(); + +private: + void section_data_impl(bool includeRegExOnly = true); + template void section_impl(); }; tst_QString::tst_QString() { } +void tst_QString::section_data_impl(bool includeRegExOnly) +{ + QTest::addColumn("s"); + QTest::addColumn("sep"); + QTest::addColumn("isRegExp"); + + QTest::newRow("IPv4") << QStringLiteral("192.168.0.1") << QStringLiteral(".") << false; + QTest::newRow("IPv6") << QStringLiteral("2001:0db8:85a3:0000:0000:8a2e:0370:7334") << QStringLiteral(":") << false; + if (includeRegExOnly) { + QTest::newRow("IPv6-reversed-roles") << QStringLiteral("2001:0db8:85a3:0000:0000:8a2e:0370:7334") << QStringLiteral("\\d+") << true; + QTest::newRow("IPv6-complex") << QStringLiteral("2001:0db8:85a3:0000:0000:8a2e:0370:7334") << QStringLiteral("(\\d+):\\1") << true; + } +} + +template +inline QString escape(const QString &s) +{ return RX::escape(s); } + +template <> +inline QString escape(const QString &s) +{ return s; } + +template +inline void optimize(RX &) {} + +template <> +inline void optimize(QRegularExpression &rx) +{ rx.optimize(); } + +template +void tst_QString::section_impl() +{ + QFETCH(QString, s); + QFETCH(QString, sep); + QFETCH(bool, isRegExp); + + RX rx(isRegExp ? sep : escape(sep)); + optimize(rx); + for (int i = 0; i < 20; ++i) + (void) s.count(rx); // make (s, rx) hot + + QBENCHMARK { + const QString result = s.section(rx, 0, 16); + Q_UNUSED(result); + } +} + void tst_QString::toUpper_data() { QTest::addColumn("s"); -- cgit v1.2.3