From 613dec7c92fd1c4b30f31382b17540fca9cda81c Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Sat, 16 May 2020 14:47:01 +0200 Subject: [PATCH] Sqlite: Tweaking reserve of values function We now save the size of the maximum of all results. This can be improve performance if the result set sizes are similar. If the very different we will allocate to much memory. Because it is not changing any results it's hard to test. We maybe should add benchmarks later. Change-Id: I07227200076365b7fe4d0ac3951981469f9d454f Reviewed-by: Tim Jenssen --- src/libs/sqlite/sqlitebasestatement.h | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/src/libs/sqlite/sqlitebasestatement.h b/src/libs/sqlite/sqlitebasestatement.h index 05fbfa625b4..4c4baa11b77 100644 --- a/src/libs/sqlite/sqlitebasestatement.h +++ b/src/libs/sqlite/sqlitebasestatement.h @@ -205,10 +205,12 @@ public: { Resetter resetter{*this}; std::vector resultValues; - resultValues.reserve(reserveSize); + resultValues.reserve(std::max(reserveSize, m_maximumResultCount)); while (BaseStatement::next()) - emplaceBackValues(resultValues); + emplaceBackValues(resultValues); + + setMaximumResultCount(resultValues.size()); resetter.reset(); @@ -222,12 +224,14 @@ public: { Resetter resetter{*this}; std::vector resultValues; - resultValues.reserve(reserveSize); + resultValues.reserve(std::max(reserveSize, m_maximumResultCount)); bindValues(queryValues...); while (BaseStatement::next()) - emplaceBackValues(resultValues); + emplaceBackValues(resultValues); + + setMaximumResultCount(resultValues.size()); resetter.reset(); @@ -241,7 +245,7 @@ public: const std::vector &queryValues) { std::vector resultValues; - resultValues.reserve(reserveSize); + resultValues.reserve(std::max(reserveSize, m_maximumResultCount)); for (const QueryElementType &queryValue : queryValues) { Resetter resetter{*this}; @@ -250,6 +254,8 @@ public: while (BaseStatement::next()) emplaceBackValues(resultValues); + setMaximumResultCount(resultValues.size()); + resetter.reset(); } @@ -264,7 +270,7 @@ public: { using Container = std::vector; Container resultValues; - resultValues.reserve(reserveSize); + resultValues.reserve(std::max(reserveSize, m_maximumResultCount)); for (const auto &queryTuple : queryTuples) { Resetter resetter{*this}; @@ -273,6 +279,8 @@ public: while (BaseStatement::next()) emplaceBackValues(resultValues); + setMaximumResultCount(resultValues.size()); + resetter.reset(); } @@ -427,6 +435,13 @@ private: bindTupleValuesElement(element, ColumnIndices()); } + void setMaximumResultCount(std::size_t count) + { + m_maximumResultCount = std::max(m_maximumResultCount, count); + } + +public: + std::size_t m_maximumResultCount = 0; }; } // namespace Sqlite