ogoffart@oscar demos]$ ./textedit/textedit HASH stat: total=1024 dup=678 STRING stat: total=53616 hashed=344 [ogoffart@oscar demos]$ ./textedit/textedit HASH stat: total=5132 dup=4072 STRING stat: total=101315 hashed=1057 [ogoffart@oscar demos]$ qmlviewer Qml debugging is enabled. Only use this in a safe environment! HASH stat: total=5341 dup=3989 STRING stat: total=70257 hashed=1323 [ogoffart@oscar demos]$ qmlviewer Qml debugging is enabled. Only use this in a safe environment! HASH stat: total=1691 dup=732 STRING stat: total=14373 hashed=930 [ogoffart@oscar demos]$ ./browser/browser HASH stat: total=2951 dup=1080 STRING stat: total=111836 hashed=1870 diff --git a/src/corelib/tools/qhash.cpp b/src/corelib/tools/qhash.cpp index f43e888..bfd34dd 100644 --- a/src/corelib/tools/qhash.cpp +++ b/src/corelib/tools/qhash.cpp @@ -94,8 +94,22 @@ uint qHash(const QByteArray &key) return hash(reinterpret_cast(key.constData()), key.size()); } + +#include + uint qHash(const QString &key) { + struct Stat { + QBasicAtomicInt count; +// QBasicAtomicInt simple; + QBasicAtomicInt dup; + ~Stat() { std::cout <<"HASH stat: total=" << int(count) << " dup=" << int(dup) << std::endl; } + }; + static Stat s = {0, 0}; + s.count.ref(); + if (key.asciicache()) + s.dup.ref(); + key.setAsciicache(); return hash(key.unicode(), key.size()); } diff --git a/src/corelib/tools/qstring.cpp b/src/corelib/tools/qstring.cpp index ee45cfd..71e33e5 100644 --- a/src/corelib/tools/qstring.cpp +++ b/src/corelib/tools/qstring.cpp @@ -1219,9 +1219,22 @@ QString::QString(QChar ch) \internal */ +#include // ### Qt 5: rename freeData() to avoid confusion. See task 197625. void QString::free(Data *d) { + + struct Stat { + QBasicAtomicInt count; + // QBasicAtomicInt simple; + QBasicAtomicInt hash; + ~Stat() { std::cout <<"STRING stat: total=" << int(count) << " hashed=" << int(hash) << std::endl; } + }; + static Stat s = {0, 0}; + s.count.ref(); + if (d->asciiCache) + s.hash.ref(); + #ifdef QT3_SUPPORT if (d->asciiCache) { Q_ASSERT(asciiCache); diff --git a/src/corelib/tools/qstring.h b/src/corelib/tools/qstring.h index bf0a0ad..9c82029 100644 --- a/src/corelib/tools/qstring.h +++ b/src/corelib/tools/qstring.h @@ -590,6 +590,10 @@ public: QString(int size, Qt::Initialization); + bool asciicache() const { return d->asciiCache; } + void setAsciicache() const { const_cast(d)->asciiCache = 1; } + + private: #if defined(QT_NO_CAST_FROM_ASCII) && !defined(Q_NO_DECLARED_NOT_DEFINED) QString &operator+=(const char *s); @@ -600,6 +604,7 @@ private: QString &operator=(const QByteArray &a); #endif + struct Data { QBasicAtomicInt ref; int alloc, size; @@ -712,7 +717,7 @@ inline QChar *QString::data() inline const QChar *QString::constData() const { return reinterpret_cast(d->data); } inline void QString::detach() -{ if (d->ref != 1 || d->data != d->array) realloc(); } +{ if (d->ref != 1 || d->data != d->array) realloc(); else if (d->ref==1) d->asciiCache = 0; } inline bool QString::isDetached() const { return d->ref == 1; } inline QString &QString::operator=(const QLatin1String &s)