diff options
author | Lars Knoll <lars.knoll@nokia.com> | 2012-03-20 20:45:27 +0100 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-03-22 18:59:45 +0100 |
commit | 349c0de0912884388f2490d4bfd6905424ccf194 (patch) | |
tree | a939e29f8ab31b2a90a0d2d9b67094f0375c901b /src/corelib | |
parent | 8dd18751e18ef9509729cbaca6ca5e6810729e2c (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.cpp | 8 | ||||
-rw-r--r-- | src/corelib/json/qjson_p.h | 21 |
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); |