Add benchmark for QString::section()
Change-Id: I7ca4ceb8cfa7a3df384400a1b3ebc9be2502e396 Reviewed-by: Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
This commit is contained in:
parent
0356f5a36d
commit
03e794b7a6
@ -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");
|
||||
|
Loading…
Reference in New Issue
Block a user