Boost logo

Boost Users :

From: Dominique Pellé (dominique.pelle_at_[hidden])
Date: 2022-07-05 08:29:48


Hi

This following program shows many allocations coming
from boost::split(..., boost::is_any_of(",")):
```
$ cat split.cpp

#include <string>
#include <cstdio>
#include <boost/algorithm/string.hpp>
#include <boost/container/small_vector.hpp>

int main() {
  std::string str = "foo,bar,foobar,quux";
  std::size_t s = 0;
  for (int i = 0; i < 100; ++i) {
    boost::container::small_vector<std::string, 4> v;
#ifdef USE_IS_ANY_OF
    boost::split(v, str, boost::is_any_of(","));
#else
    boost::split(v, str, [](const char c) { return c == ',';});
#endif
    s += v.size();
  }
  fprintf(stderr, "%zu\n", s);
}
```
When using boost::is_any_of(","), there are 7 dynamic allocations
per loop iteration whereas when using the lambda predicate,
there are 0 dynamic allocation per loop as shown below:
```
$ clang++ -std=c++14 -DUSE_IS_ANY_OF split.cpp
$ heaptrack ./a.out
  ...
  allocations: 702

$ clang++ -std=c++14 split.cpp
$ heaptrack ./a.out
   ...
  allocations: 2
```

I suspect that there are potential optimizations in Boost here to
avoid so many allocations when boost::is_any_of(",") is used.

Regards
Dominique


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net