2009-04-30 10:01:54 +02:00
|
|
|
|
2009-05-20 10:37:41 +02:00
|
|
|
#include "qstringbuilder.h"
|
|
|
|
|
|
2009-04-30 10:01:54 +02:00
|
|
|
#include <QDebug>
|
|
|
|
|
#include <QString>
|
|
|
|
|
|
|
|
|
|
#include <qtest.h>
|
|
|
|
|
|
|
|
|
|
|
2009-05-20 10:37:41 +02:00
|
|
|
#define COMPARE(a, b) QCOMPARE(a, b)
|
|
|
|
|
//#define COMPARE(a, b)
|
|
|
|
|
|
2009-05-25 12:20:47 +02:00
|
|
|
#define SEP(s) qDebug() << "\n\n-------- " s " ---------";
|
|
|
|
|
#define L(s) QLatin1String(s)
|
2009-05-20 11:48:29 +02:00
|
|
|
|
2009-04-30 10:01:54 +02:00
|
|
|
class tst_qstringbuilder : public QObject
|
|
|
|
|
{
|
|
|
|
|
Q_OBJECT
|
|
|
|
|
|
|
|
|
|
public:
|
2009-05-25 12:20:47 +02:00
|
|
|
tst_qstringbuilder()
|
2009-05-27 12:56:33 +02:00
|
|
|
: l1literal("some string literal"),
|
|
|
|
|
l1string("some string literal"),
|
|
|
|
|
ba("some string literal"),
|
2009-05-25 12:20:47 +02:00
|
|
|
string(l1string),
|
2009-05-25 17:00:31 +02:00
|
|
|
stringref(&string, 2, 10),
|
2009-05-25 12:20:47 +02:00
|
|
|
achar('c')
|
|
|
|
|
{}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
enum { N = 10000 };
|
|
|
|
|
|
|
|
|
|
int run_traditional()
|
|
|
|
|
{
|
|
|
|
|
int s = 0;
|
|
|
|
|
for (int i = 0; i < N; ++i) {
|
|
|
|
|
#if 0
|
|
|
|
|
s += QString(l1string + l1string).size();
|
|
|
|
|
s += QString(l1string + l1string + l1string).size();
|
|
|
|
|
s += QString(l1string + l1string + l1string + l1string).size();
|
|
|
|
|
s += QString(l1string + l1string + l1string + l1string + l1string).size();
|
|
|
|
|
#endif
|
|
|
|
|
s += QString(achar + l1string + achar).size();
|
|
|
|
|
}
|
|
|
|
|
return s;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int run_builder()
|
|
|
|
|
{
|
|
|
|
|
int s = 0;
|
|
|
|
|
for (int i = 0; i < N; ++i) {
|
|
|
|
|
#if 0
|
|
|
|
|
s += QString(l1literal % l1literal).size();
|
|
|
|
|
s += QString(l1literal % l1literal % l1literal).size();
|
|
|
|
|
s += QString(l1literal % l1literal % l1literal % l1literal).size();
|
|
|
|
|
s += QString(l1literal % l1literal % l1literal % l1literal % l1literal).size();
|
|
|
|
|
#endif
|
|
|
|
|
s += QString(achar % l1literal % achar).size();
|
|
|
|
|
}
|
|
|
|
|
return s;
|
|
|
|
|
}
|
2009-04-30 10:01:54 +02:00
|
|
|
|
|
|
|
|
private slots:
|
2009-05-20 11:48:29 +02:00
|
|
|
|
2009-05-25 12:20:47 +02:00
|
|
|
void separator_0() {
|
|
|
|
|
qDebug() << "\nIn each block the QStringBuilder based result appear first, "
|
|
|
|
|
"QStringBased second.\n";
|
|
|
|
|
}
|
2009-05-20 11:48:29 +02:00
|
|
|
|
2009-05-25 12:20:47 +02:00
|
|
|
void separator_1() { SEP("literal + literal (builder first)"); }
|
2009-05-20 11:48:29 +02:00
|
|
|
|
2009-05-25 12:20:47 +02:00
|
|
|
void b_2_l1literal() {
|
2009-05-27 12:56:33 +02:00
|
|
|
QBENCHMARK { r = l1literal % l1literal; }
|
2009-05-25 12:20:47 +02:00
|
|
|
COMPARE(r, l1string + l1string);
|
|
|
|
|
}
|
|
|
|
|
void s_2_l1string() {
|
|
|
|
|
QBENCHMARK { r = l1string + l1string; }
|
2009-05-27 12:56:33 +02:00
|
|
|
COMPARE(r, QString(l1literal % l1literal));
|
2009-05-25 12:20:47 +02:00
|
|
|
}
|
2009-05-20 11:48:29 +02:00
|
|
|
|
|
|
|
|
|
2009-05-25 12:20:47 +02:00
|
|
|
void separator_2() { SEP("2 strings"); }
|
2009-04-30 10:01:54 +02:00
|
|
|
|
2009-05-25 12:20:47 +02:00
|
|
|
void b_2_string() {
|
|
|
|
|
QBENCHMARK { r = string % string; }
|
|
|
|
|
COMPARE(r, string + string);
|
|
|
|
|
}
|
|
|
|
|
void s_2_string() {
|
|
|
|
|
QBENCHMARK { r = string + string; }
|
|
|
|
|
COMPARE(r, QString(string % string));
|
|
|
|
|
}
|
2009-04-30 10:01:54 +02:00
|
|
|
|
|
|
|
|
|
2009-05-25 17:00:31 +02:00
|
|
|
void separator_2c() { SEP("2 string refs"); }
|
|
|
|
|
|
|
|
|
|
void b_2_stringref() {
|
|
|
|
|
QBENCHMARK { r = stringref % stringref; }
|
|
|
|
|
COMPARE(r, stringref.toString() + stringref.toString());
|
|
|
|
|
}
|
|
|
|
|
void s_2_stringref() {
|
|
|
|
|
QBENCHMARK { r = stringref.toString() + stringref.toString(); }
|
|
|
|
|
COMPARE(r, QString(stringref % stringref));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2009-05-25 12:20:47 +02:00
|
|
|
void separator_2b() { SEP("3 strings"); }
|
2009-04-30 10:01:54 +02:00
|
|
|
|
2009-05-25 12:20:47 +02:00
|
|
|
void b_3_string() {
|
|
|
|
|
QBENCHMARK { r = string % string % string; }
|
|
|
|
|
COMPARE(r, string + string + string);
|
|
|
|
|
}
|
|
|
|
|
void s_3_string() {
|
|
|
|
|
QBENCHMARK { r = string + string + string; }
|
|
|
|
|
COMPARE(r, QString(string % string % string));
|
|
|
|
|
}
|
2009-04-30 10:01:54 +02:00
|
|
|
|
|
|
|
|
|
2009-05-25 12:20:47 +02:00
|
|
|
void separator_2a() { SEP("string + literal (builder first)"); }
|
2009-05-20 10:37:41 +02:00
|
|
|
|
2009-05-25 12:20:47 +02:00
|
|
|
void b_string_l1literal() {
|
|
|
|
|
QBENCHMARK { r = string % l1literal; }
|
|
|
|
|
COMPARE(r, string + l1string);
|
|
|
|
|
}
|
|
|
|
|
void b_string_l1string() {
|
|
|
|
|
QBENCHMARK { r = string % l1string; }
|
2009-05-26 12:47:39 +02:00
|
|
|
COMPARE(r, string + l1string);
|
2009-05-25 12:20:47 +02:00
|
|
|
}
|
|
|
|
|
void s_string_l1literal() {
|
2009-05-26 12:47:39 +02:00
|
|
|
QBENCHMARK { r = string + l1string; }
|
|
|
|
|
COMPARE(r, QString(string % l1literal));
|
2009-05-25 12:20:47 +02:00
|
|
|
}
|
|
|
|
|
void s_string_l1string() {
|
|
|
|
|
QBENCHMARK { r = string + l1string; }
|
|
|
|
|
COMPARE(r, QString(string % l1literal));
|
|
|
|
|
}
|
2009-04-30 10:01:54 +02:00
|
|
|
|
2009-05-20 10:37:41 +02:00
|
|
|
|
2009-05-25 12:20:47 +02:00
|
|
|
void separator_3() { SEP("3 literals"); }
|
2009-04-30 10:01:54 +02:00
|
|
|
|
2009-05-25 12:20:47 +02:00
|
|
|
void b_3_l1literal() {
|
2009-05-27 12:56:33 +02:00
|
|
|
QBENCHMARK { r = l1literal % l1literal % l1literal; }
|
2009-05-25 12:20:47 +02:00
|
|
|
COMPARE(r, l1string + l1string + l1string);
|
|
|
|
|
}
|
|
|
|
|
void s_3_l1string() {
|
|
|
|
|
QBENCHMARK { r = l1string + l1string + l1string; }
|
2009-05-27 12:56:33 +02:00
|
|
|
COMPARE(r, QString(l1literal % l1literal % l1literal));
|
2009-05-25 12:20:47 +02:00
|
|
|
}
|
2009-04-30 10:01:54 +02:00
|
|
|
|
|
|
|
|
|
2009-05-25 12:20:47 +02:00
|
|
|
void separator_4() { SEP("4 literals"); }
|
2009-04-30 10:01:54 +02:00
|
|
|
|
2009-05-25 12:20:47 +02:00
|
|
|
void b_4_l1literal() {
|
2009-05-27 12:56:33 +02:00
|
|
|
QBENCHMARK { r = l1literal % l1literal % l1literal % l1literal; }
|
2009-05-25 12:20:47 +02:00
|
|
|
COMPARE(r, l1string + l1string + l1string + l1string);
|
|
|
|
|
}
|
|
|
|
|
void s_4_l1string() {
|
|
|
|
|
QBENCHMARK { r = l1string + l1string + l1string + l1string; }
|
2009-05-27 12:56:33 +02:00
|
|
|
COMPARE(r, QString(l1literal % l1literal % l1literal % l1literal));
|
2009-05-25 12:20:47 +02:00
|
|
|
}
|
2009-05-20 10:37:41 +02:00
|
|
|
|
2009-04-30 10:01:54 +02:00
|
|
|
|
2009-05-25 12:20:47 +02:00
|
|
|
void separator_5() { SEP("5 literals"); }
|
|
|
|
|
|
|
|
|
|
void b_5_l1literal() {
|
2009-05-27 12:56:33 +02:00
|
|
|
QBENCHMARK { r = l1literal % l1literal % l1literal % l1literal %l1literal; }
|
2009-05-25 12:20:47 +02:00
|
|
|
COMPARE(r, l1string + l1string + l1string + l1string + l1string);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void s_5_l1string() {
|
|
|
|
|
QBENCHMARK { r = l1string + l1string + l1string + l1string + l1string; }
|
2009-05-27 12:56:33 +02:00
|
|
|
COMPARE(r, QString(l1literal % l1literal % l1literal % l1literal % l1literal));
|
2009-05-25 12:20:47 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void separator_6() { SEP("4 chars"); }
|
|
|
|
|
|
|
|
|
|
void b_string_4_char() {
|
|
|
|
|
QBENCHMARK { r = string + achar + achar + achar + achar; }
|
|
|
|
|
COMPARE(r, QString(string % achar % achar % achar % achar));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void s_string_4_char() {
|
|
|
|
|
QBENCHMARK { r = string + achar + achar + achar + achar; }
|
|
|
|
|
COMPARE(r, QString(string % achar % achar % achar % achar));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void separator_7() { SEP("char + string + char"); }
|
|
|
|
|
|
|
|
|
|
void b_char_string_char() {
|
|
|
|
|
QBENCHMARK { r = achar + string + achar; }
|
|
|
|
|
COMPARE(r, QString(achar % string % achar));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void s_char_string_char() {
|
|
|
|
|
QBENCHMARK { r = achar + string + achar; }
|
|
|
|
|
COMPARE(r, QString(achar % string % achar));
|
|
|
|
|
}
|
|
|
|
|
|
2009-05-26 11:02:53 +02:00
|
|
|
void separator_8() { SEP("string.arg"); }
|
|
|
|
|
|
|
|
|
|
void b_string_arg() {
|
|
|
|
|
const QString pattern = l1string + "%1" + l1string;
|
|
|
|
|
QBENCHMARK { r = l1literal % string % l1literal; }
|
|
|
|
|
COMPARE(r, l1string + string + l1string);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void s_string_arg() {
|
|
|
|
|
const QString pattern = l1string + "%1" + l1string;
|
|
|
|
|
QBENCHMARK { r = pattern.arg(string); }
|
|
|
|
|
COMPARE(r, l1string + string + l1string);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void s_bytearray_arg() {
|
|
|
|
|
QByteArray result;
|
|
|
|
|
QBENCHMARK { result = ba + ba + ba; }
|
|
|
|
|
}
|
|
|
|
|
|
2009-05-26 15:52:53 +02:00
|
|
|
|
|
|
|
|
void separator_9() { SEP("QString::reserve()"); }
|
|
|
|
|
|
|
|
|
|
void b_reserve() {
|
|
|
|
|
QBENCHMARK {
|
|
|
|
|
r.clear();
|
|
|
|
|
r = string % string % string % string;
|
|
|
|
|
}
|
|
|
|
|
COMPARE(r, string + string + string + string);
|
|
|
|
|
}
|
|
|
|
|
void b_reserve_lit() {
|
|
|
|
|
QBENCHMARK {
|
|
|
|
|
r.clear();
|
|
|
|
|
r = string % l1literal % string % string;
|
|
|
|
|
}
|
|
|
|
|
COMPARE(r, string + string + string + string);
|
|
|
|
|
}
|
|
|
|
|
void s_reserve() {
|
|
|
|
|
QBENCHMARK {
|
|
|
|
|
r.clear();
|
|
|
|
|
r.reserve(string.size() + string.size() + string.size() + string.size());
|
|
|
|
|
r += string;
|
|
|
|
|
r += string;
|
|
|
|
|
r += string;
|
|
|
|
|
r += string;
|
|
|
|
|
}
|
|
|
|
|
COMPARE(r, string + string + string + string);
|
|
|
|
|
}
|
|
|
|
|
void s_reserve_lit() {
|
|
|
|
|
QBENCHMARK {
|
|
|
|
|
r.clear();
|
|
|
|
|
//r.reserve(string.size() + qstrlen(l1string.latin1())
|
|
|
|
|
// + string.size() + string.size());
|
|
|
|
|
r.reserve(1024);
|
|
|
|
|
r += string;
|
|
|
|
|
r += l1string;
|
|
|
|
|
r += string;
|
|
|
|
|
r += string;
|
|
|
|
|
}
|
|
|
|
|
COMPARE(r, string + string + string + string);
|
|
|
|
|
}
|
|
|
|
|
|
2009-05-25 12:20:47 +02:00
|
|
|
private:
|
2009-05-27 12:56:33 +02:00
|
|
|
const QLatin1Literal l1literal;
|
2009-05-25 12:20:47 +02:00
|
|
|
const QLatin1String l1string;
|
2009-05-26 11:02:53 +02:00
|
|
|
const QByteArray ba;
|
2009-05-25 12:20:47 +02:00
|
|
|
const QString string;
|
2009-05-25 17:00:31 +02:00
|
|
|
const QStringRef stringref;
|
2009-05-25 12:20:47 +02:00
|
|
|
const QLatin1Char achar;
|
|
|
|
|
|
|
|
|
|
QString r;
|
|
|
|
|
};
|
|
|
|
|
|
2009-05-20 10:37:41 +02:00
|
|
|
|
2009-05-26 15:52:53 +02:00
|
|
|
//void operator%(QString, int) {}
|
|
|
|
|
|
2009-05-25 12:20:47 +02:00
|
|
|
int main(int argc, char *argv[])
|
2009-05-20 10:37:41 +02:00
|
|
|
{
|
2009-05-27 16:49:45 +02:00
|
|
|
//qDebug() << (QString("xx") * QLatin1String("y")).toString();
|
|
|
|
|
//42 % 3; // Sanity test, should always work.
|
2009-05-26 15:52:53 +02:00
|
|
|
//QString("x") % 2; // Sanity test, should only compile when the
|
|
|
|
|
// operator%(QString, int) is visible.
|
|
|
|
|
|
2009-05-25 12:20:47 +02:00
|
|
|
if (argc == 2 && (argv[1] == L("--run-builder") || argv[1] == L("-b"))) {
|
|
|
|
|
tst_qstringbuilder test;
|
|
|
|
|
return test.run_builder();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (argc == 2 && (argv[1] == L("--run-traditional") || argv[1] == L("-t"))) {
|
|
|
|
|
tst_qstringbuilder test;
|
|
|
|
|
return test.run_traditional();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (argc == 1) {
|
|
|
|
|
QCoreApplication app(argc, argv);
|
|
|
|
|
QStringList args = app.arguments();
|
|
|
|
|
tst_qstringbuilder test;
|
|
|
|
|
return QTest::qExec(&test, argc, argv);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
qDebug() << "Usage: " << argv[0] << " [--run-builder|-r|--run-traditional|-t]";
|
2009-04-30 10:29:48 +02:00
|
|
|
}
|
|
|
|
|
|
2009-04-30 10:01:54 +02:00
|
|
|
|
|
|
|
|
#include "main.moc"
|