summaryrefslogtreecommitdiffstats
path: root/src/corelib/tools
diff options
context:
space:
mode:
authorDaniel Teske <daniel.teske@digia.com>2014-09-05 11:51:01 +0200
committerDaniel Teske <daniel.teske@digia.com>2014-09-15 17:44:52 +0200
commit46ebcb6176c25c294c5edbeaaa757fe0ce53903e (patch)
tree3a301525d2d3b63528f6b70a8f9c61c2c9a33831 /src/corelib/tools
parentf5b53c8e3ececbdac1a7da56cbdc850e542316b9 (diff)
Speed up QStringList::removeDuplicates by ~2x
QSet::contains needs to hash the string, which is unnecessary, since we can just check if the size of the set changed. Change-Id: I2c7a42bae6cdf351533d5a582a42079658fa7729 Reviewed-by: Marc Mutz <marc.mutz@kdab.com> Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@digia.com>
Diffstat (limited to 'src/corelib/tools')
-rw-r--r--src/corelib/tools/qstringlist.cpp6
1 files changed, 4 insertions, 2 deletions
diff --git a/src/corelib/tools/qstringlist.cpp b/src/corelib/tools/qstringlist.cpp
index 0d37b6ea58..cd14bb8b78 100644
--- a/src/corelib/tools/qstringlist.cpp
+++ b/src/corelib/tools/qstringlist.cpp
@@ -751,11 +751,13 @@ int QtPrivate::QStringList_removeDuplicates(QStringList *that)
int j = 0;
QSet<QString> seen;
seen.reserve(n);
+ int setSize = 0;
for (int i = 0; i < n; ++i) {
const QString &s = that->at(i);
- if (seen.contains(s))
- continue;
seen.insert(s);
+ if (setSize == seen.size()) // unchanged size => was already seen
+ continue;
+ ++setSize;
if (j != i)
that->swap(i, j);
++j;