summaryrefslogtreecommitdiffstats
path: root/src/corelib
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@nokia.com>2012-03-20 20:45:27 +0100
committerQt by Nokia <qt-info@nokia.com>2012-03-22 18:59:45 +0100
commit349c0de0912884388f2490d4bfd6905424ccf194 (patch)
treea939e29f8ab31b2a90a0d2d9b67094f0375c901b /src/corelib
parent8dd18751e18ef9509729cbaca6ca5e6810729e2c (diff)
Significantly speed up insertion into QJsonObject/Array
The code was only allocating memory for the next insertion leading to a reallocation of the whole data for every single insertion. The code now reserves some space and uses a decent growth strategy to avoid repeated reallocs. Change-Id: I48b0feab71ba8ca73e7037f8460080f198b2f009 Reviewed-by: Jamey Hicks <jamey.hicks@nokia.com>
Diffstat (limited to 'src/corelib')
-rw-r--r--src/corelib/json/qjson.cpp8
-rw-r--r--src/corelib/json/qjson_p.h21
2 files changed, 19 insertions, 10 deletions
diff --git a/src/corelib/json/qjson.cpp b/src/corelib/json/qjson.cpp
index 4f7372a6c0..26f26b211e 100644
--- a/src/corelib/json/qjson.cpp
+++ b/src/corelib/json/qjson.cpp
@@ -241,14 +241,6 @@ bool Entry::operator ==(const QString &key) const
return (shallowKey() == key);
}
-bool Entry::operator >=(const QString &key) const
-{
- if (value.latinKey)
- return (shallowLatin1Key() >= key);
- else
- return (shallowKey() >= key);
-}
-
bool Entry::operator ==(const Entry &other) const
{
if (value.latinKey) {
diff --git a/src/corelib/json/qjson_p.h b/src/corelib/json/qjson_p.h
index 0742ced39b..f8f41c2e25 100644
--- a/src/corelib/json/qjson_p.h
+++ b/src/corelib/json/qjson_p.h
@@ -620,15 +620,24 @@ public:
bool operator ==(const QString &key) const;
inline bool operator !=(const QString &key) const { return !operator ==(key); }
- bool operator >=(const QString &key) const;
+ inline bool operator >=(const QString &key) const;
bool operator ==(const Entry &other) const;
bool operator >=(const Entry &other) const;
};
+inline bool Entry::operator >=(const QString &key) const
+{
+ if (value.latinKey)
+ return (shallowLatin1Key() >= key);
+ else
+ return (shallowKey() >= key);
+}
+
inline bool operator <(const QString &key, const Entry &e)
{ return e >= key; }
+
class Header {
public:
qle_uint tag; // 'qbjs'
@@ -735,7 +744,15 @@ public:
Data *clone(Base *b, int reserve = 0)
{
- int size = sizeof(Header) + b->size + reserve;
+ int size = sizeof(Header) + b->size;
+ if (ref.load() == 1 && alloc >= size + reserve)
+ return this;
+
+ if (reserve) {
+ if (reserve < 128)
+ reserve = 128;
+ size = qMax(size + reserve, size *2);
+ }
char *raw = (char *)malloc(size);
Q_CHECK_PTR(raw);
memcpy(raw + sizeof(Header), b, b->size);