Use reserve() over resize() for Map

Signed-off-by: Azat Khuzhin <a.khuzhin@semrush.com>
This commit is contained in:
Azat Khuzhin 2022-01-28 20:02:13 +03:00
parent 9e740eb9d0
commit b511abb72c
2 changed files with 11 additions and 7 deletions

View File

@ -64,8 +64,9 @@ MutableColumnPtr ColumnMap::cloneResized(size_t new_size) const
Field ColumnMap::operator[](size_t n) const Field ColumnMap::operator[](size_t n) const
{ {
auto array = DB::get<Array>((*nested)[n]); Field res;
return Map(std::make_move_iterator(array.begin()), std::make_move_iterator(array.end())); get(n, res);
return res;
} }
void ColumnMap::get(size_t n, Field & res) const void ColumnMap::get(size_t n, Field & res) const
@ -74,11 +75,12 @@ void ColumnMap::get(size_t n, Field & res) const
size_t offset = offsets[n - 1]; size_t offset = offsets[n - 1];
size_t size = offsets[n] - offsets[n - 1]; size_t size = offsets[n] - offsets[n - 1];
res = Map(size); res = Map();
auto & map = DB::get<Map &>(res); auto & map = DB::get<Map &>(res);
map.reserve(size);
for (size_t i = 0; i < size; ++i) for (size_t i = 0; i < size; ++i)
getNestedData().get(offset + i, map[i]); map.push_back(getNestedData()[offset + i]);
} }
bool ColumnMap::isDefaultAt(size_t n) const bool ColumnMap::isDefaultAt(size_t n) const

View File

@ -53,13 +53,15 @@ void SerializationMap::deserializeBinary(Field & field, ReadBuffer & istr) const
{ {
size_t size; size_t size;
readVarUInt(size, istr); readVarUInt(size, istr);
field = Map(size); field = Map();
for (auto & elem : field.get<Map &>()) Map & map = field.get<Map &>();
map.reserve(size);
for (size_t i = 0; i < size; ++i)
{ {
Tuple tuple(2); Tuple tuple(2);
key->deserializeBinary(tuple[0], istr); key->deserializeBinary(tuple[0], istr);
value->deserializeBinary(tuple[1], istr); value->deserializeBinary(tuple[1], istr);
elem = std::move(tuple); map.push_back(std::move(tuple));
} }
} }