Add benchmark for QString::section()

Change-Id: I7ca4ceb8cfa7a3df384400a1b3ebc9be2502e396
Reviewed-by: Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
This commit is contained in:
Marc Mutz 2014-08-14 10:06:14 +02:00
parent 0356f5a36d
commit 03e794b7a6

View File

@ -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<QRegExp>(); }
void section_regularexpression_data() { section_data_impl(); }
void section_regularexpression() { section_impl<QRegularExpression>(); }
void section_string_data() { section_data_impl(false); }
void section_string() { section_impl<QString>(); }
void toUpper_data();
void toUpper();
void toLower_data();
void toLower();
void toCaseFolded_data();
void toCaseFolded();
private:
void section_data_impl(bool includeRegExOnly = true);
template <typename RX> void section_impl();
};
tst_QString::tst_QString()
{
}
void tst_QString::section_data_impl(bool includeRegExOnly)
{
QTest::addColumn<QString>("s");
QTest::addColumn<QString>("sep");
QTest::addColumn<bool>("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 <typename RX>
inline QString escape(const QString &s)
{ return RX::escape(s); }
template <>
inline QString escape<QString>(const QString &s)
{ return s; }
template <typename RX>
inline void optimize(RX &) {}
template <>
inline void optimize(QRegularExpression &rx)
{ rx.optimize(); }
template <typename RX>
void tst_QString::section_impl()
{
QFETCH(QString, s);
QFETCH(QString, sep);
QFETCH(bool, isRegExp);
RX rx(isRegExp ? sep : escape<RX>(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<QString>("s");