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};
std::vector<ResultType> resultValues;
resultValues.reserve(reserveSize);
resultValues.reserve(std::max(reserveSize, m_maximumResultCount));
while (BaseStatement::next())
emplaceBackValues<ResultTypeCount>(resultValues);
setMaximumResultCount(resultValues.size());
resetter.reset();
return resultValues;
@@ -222,13 +224,15 @@ public:
{
Resetter resetter{*this};
std::vector<ResultType> resultValues;
resultValues.reserve(reserveSize);
resultValues.reserve(std::max(reserveSize, m_maximumResultCount));
bindValues(queryValues...);
while (BaseStatement::next())
emplaceBackValues<ResultTypeCount>(resultValues);
setMaximumResultCount(resultValues.size());
resetter.reset();
return resultValues;
@@ -241,7 +245,7 @@ public:
const std::vector<QueryElementType> &queryValues)
{
std::vector<ResultType> 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<ResultTypeCount>(resultValues);
setMaximumResultCount(resultValues.size());
resetter.reset();
}
@@ -264,7 +270,7 @@ public:
{
using Container = std::vector<ResultType>;
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<ResultTypeCount>(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