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 <tim.jenssen@qt.io>
This commit is contained in:
Marco Bubke
2020-05-16 14:47:01 +02:00
committed by Tim Jenssen
parent 36fd58fbe9
commit 613dec7c92

View File

@@ -205,11 +205,13 @@ public:
{ {
Resetter resetter{*this}; Resetter resetter{*this};
std::vector<ResultType> resultValues; std::vector<ResultType> resultValues;
resultValues.reserve(reserveSize); resultValues.reserve(std::max(reserveSize, m_maximumResultCount));
while (BaseStatement::next()) while (BaseStatement::next())
emplaceBackValues<ResultTypeCount>(resultValues); emplaceBackValues<ResultTypeCount>(resultValues);
setMaximumResultCount(resultValues.size());
resetter.reset(); resetter.reset();
return resultValues; return resultValues;
@@ -222,13 +224,15 @@ public:
{ {
Resetter resetter{*this}; Resetter resetter{*this};
std::vector<ResultType> resultValues; std::vector<ResultType> resultValues;
resultValues.reserve(reserveSize); resultValues.reserve(std::max(reserveSize, m_maximumResultCount));
bindValues(queryValues...); bindValues(queryValues...);
while (BaseStatement::next()) while (BaseStatement::next())
emplaceBackValues<ResultTypeCount>(resultValues); emplaceBackValues<ResultTypeCount>(resultValues);
setMaximumResultCount(resultValues.size());
resetter.reset(); resetter.reset();
return resultValues; return resultValues;
@@ -241,7 +245,7 @@ public:
const std::vector<QueryElementType> &queryValues) const std::vector<QueryElementType> &queryValues)
{ {
std::vector<ResultType> resultValues; std::vector<ResultType> resultValues;
resultValues.reserve(reserveSize); resultValues.reserve(std::max(reserveSize, m_maximumResultCount));
for (const QueryElementType &queryValue : queryValues) { for (const QueryElementType &queryValue : queryValues) {
Resetter resetter{*this}; Resetter resetter{*this};
@@ -250,6 +254,8 @@ public:
while (BaseStatement::next()) while (BaseStatement::next())
emplaceBackValues<ResultTypeCount>(resultValues); emplaceBackValues<ResultTypeCount>(resultValues);
setMaximumResultCount(resultValues.size());
resetter.reset(); resetter.reset();
} }
@@ -264,7 +270,7 @@ public:
{ {
using Container = std::vector<ResultType>; using Container = std::vector<ResultType>;
Container resultValues; Container resultValues;
resultValues.reserve(reserveSize); resultValues.reserve(std::max(reserveSize, m_maximumResultCount));
for (const auto &queryTuple : queryTuples) { for (const auto &queryTuple : queryTuples) {
Resetter resetter{*this}; Resetter resetter{*this};
@@ -273,6 +279,8 @@ public:
while (BaseStatement::next()) while (BaseStatement::next())
emplaceBackValues<ResultTypeCount>(resultValues); emplaceBackValues<ResultTypeCount>(resultValues);
setMaximumResultCount(resultValues.size());
resetter.reset(); resetter.reset();
} }
@@ -427,6 +435,13 @@ private:
bindTupleValuesElement(element, ColumnIndices()); 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 } // namespace Sqlite