From 38e6ccf54c287e566ad49e6cf630531af8e20f5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jaakko=20Ker=C3=A4nen?= Date: Wed, 8 Jul 2015 21:21:56 +0300 Subject: [PATCH] Performance|libdoomsday: Optimized checking of DEDRegister size When a map is being loaded, the size of a DEDRegister is checked numerous times. These changes remove the big performance bottleneck of looking up the "order" variable repeatedly from a QMap. --- .../apps/libdoomsday/src/defs/dedregister.cpp | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/doomsday/apps/libdoomsday/src/defs/dedregister.cpp b/doomsday/apps/libdoomsday/src/defs/dedregister.cpp index 51e8c62cfe..c4bfb88972 100644 --- a/doomsday/apps/libdoomsday/src/defs/dedregister.cpp +++ b/doomsday/apps/libdoomsday/src/defs/dedregister.cpp @@ -27,6 +27,8 @@ using namespace de; +static QString const VAR_ORDER = "order"; + DENG2_PIMPL(DEDRegister) , DENG2_OBSERVES(Record, Deletion) , DENG2_OBSERVES(Record, Addition) @@ -34,6 +36,7 @@ DENG2_PIMPL(DEDRegister) , DENG2_OBSERVES(Variable, ChangeFrom) { Record *names; + ArrayValue *orderArray; struct Key { LookupFlags flags; Key(LookupFlags const &f = DefaultLookup) : flags(f) {} @@ -47,7 +50,7 @@ DENG2_PIMPL(DEDRegister) names->audienceForDeletion() += this; // The definitions will be stored here in the original order. - names->addArray("order"); + orderArray = &names->addArray(VAR_ORDER).array(); } ~Instance() @@ -58,14 +61,15 @@ DENG2_PIMPL(DEDRegister) void recordBeingDeleted(Record &DENG2_DEBUG_ONLY(record)) { DENG2_ASSERT(names == &record); - names = 0; + names = nullptr; + orderArray = nullptr; } void clear() { // As a side-effect, the lookups will be cleared, too, as the members of // each definition record are deleted. - (*names)["order"].array().clear(); + order().clear(); #ifdef DENG2_DEBUG DENG2_ASSERT(parents.isEmpty()); @@ -84,12 +88,14 @@ DENG2_PIMPL(DEDRegister) ArrayValue &order() { - return (*names)["order"].array(); + DENG2_ASSERT(orderArray != nullptr); + return *orderArray; } ArrayValue const &order() const { - return (*names)["order"].array(); + DENG2_ASSERT(orderArray != nullptr); + return *orderArray; } DictionaryValue &lookup(String const &keyName)