The current version of bsoncxx::document::view::find() is implemented in terms of bson_iter_init_find(). This implementation requires a call to string_view::to_string() (which performs an allocation), in order to conform to the bson_iter_t API (which expects null-terminated strings). See snippet below:
168 view::iterator view::find(stdx::string_view key) const { 169 bson_t b; 170 bson_iter_t iter; 171 172 if (!bson_init_static(&b, _data, _length)) { 173 return end(); 174 } 175 176 if (bson_iter_init_find(&iter, &b, key.to_string().data())) { 177 return iterator(element(iter.raw, iter.len, iter.off)); 178 } 179 180 return end(); 181 }
This method could be rewritten to avoid the allocation by manually iterating the bson_iter_t to find the desired element, instead of relying on bson_iter_init_find().
Other calls to string_view::to_string() could possibly be audited to determine whether similar performance improvements could be gained elsewhere.
- causes
-
CXX-1476 Element search stops prematurely due to missing string length check
- Closed
- related to
-
CDRIVER-2414 bson_iter{_init}_find should have length taking overloads
- Closed