diff options
author | Robin Burchell <robin+qt@viroteck.net> | 2012-02-28 20:56:14 +0100 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-02-29 22:39:00 +0100 |
commit | 1f4804452c05c57308979bf090305c7c882f92c9 (patch) | |
tree | 9b95efd8dee3081008e22867b753f2ebc0d64507 | |
parent | 57004b7fda861e1e59a00688a859f30d9a088b4e (diff) | |
download | qtbase-1f4804452c05c57308979bf090305c7c882f92c9.tar.gz |
Copy Qt 4's QString hash algorithm.
We must do this the same way we do all other hash algorithms for fair
comparison, as otherwise, the call to the PLT unfairly penalises
QHash<QString>'s results, as it's in a different shared object.
Change-Id: I69c891f5a97dcccdfcfbdbf32796f86242a42963
Reviewed-by: João Abecasis <joao.abecasis@nokia.com>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
-rw-r--r-- | tests/benchmarks/corelib/tools/qhash/main.cpp | 7 | ||||
-rw-r--r-- | tests/benchmarks/corelib/tools/qhash/main.h | 11 | ||||
-rw-r--r-- | tests/benchmarks/corelib/tools/qhash/outofline.cpp | 18 |
3 files changed, 32 insertions, 4 deletions
diff --git a/tests/benchmarks/corelib/tools/qhash/main.cpp b/tests/benchmarks/corelib/tools/qhash/main.cpp index 7a871b455c..62384fbaa7 100644 --- a/tests/benchmarks/corelib/tools/qhash/main.cpp +++ b/tests/benchmarks/corelib/tools/qhash/main.cpp @@ -138,8 +138,11 @@ void tst_QHash::data() void tst_QHash::qhash_qt4() { QFETCH(QStringList, items); - QStringList realitems = items; // for copy/paste ease between benchmarks - QHash<QString, int> hash; + QHash<Qt4String, int> hash; + + QList<Qt4String> realitems; + foreach (const QString &s, items) + realitems.append(s); QBENCHMARK { for (int i = 0, n = realitems.size(); i != n; ++i) { diff --git a/tests/benchmarks/corelib/tools/qhash/main.h b/tests/benchmarks/corelib/tools/qhash/main.h index c4cf94e190..3d193b5e40 100644 --- a/tests/benchmarks/corelib/tools/qhash/main.h +++ b/tests/benchmarks/corelib/tools/qhash/main.h @@ -41,6 +41,17 @@ #include <QString> +struct Qt4String : QString +{ + Qt4String() {} + Qt4String(const QString &s) : QString(s) {} +}; + +QT_BEGIN_NAMESPACE +uint qHash(const Qt4String &); +QT_END_NAMESPACE + + struct String : QString { String() {} diff --git a/tests/benchmarks/corelib/tools/qhash/outofline.cpp b/tests/benchmarks/corelib/tools/qhash/outofline.cpp index 162c604a35..8adaa0a04f 100644 --- a/tests/benchmarks/corelib/tools/qhash/outofline.cpp +++ b/tests/benchmarks/corelib/tools/qhash/outofline.cpp @@ -41,6 +41,22 @@ #include "main.h" +QT_BEGIN_NAMESPACE + +uint qHash(const Qt4String &str) +{ + int n = str.length(); + const QChar *p = str.unicode(); + uint h = 0; + + while (n--) { + h = (h << 4) + (*p++).unicode(); + h ^= (h & 0xf0000000) >> 23; + h &= 0x0fffffff; + } + return h; +} + static void doHash(const unsigned short *p, uint &h) { #if 1 @@ -67,8 +83,6 @@ static void doHash(const unsigned short *p, uint &h) #endif } -QT_BEGIN_NAMESPACE - uint qHash(const String &str) { const unsigned short *p = (unsigned short *)str.constData(); |