[libcxx-commits] [PATCH] D149830: [libc++][ranges] Implement the changes to node-based containers from P1206 (`ranges::to`):
Konstantin Varlamov via Phabricator via libcxx-commits
libcxx-commits at lists.llvm.org
Mon Jul 17 18:20:27 PDT 2023
var-const added inline comments.
================
Comment at: libcxx/include/list:786-788
+ for (auto&& __e : __range) {
+ __emplace_back(std::forward<decltype(__e)>(__e));
+ }
----------------
ldionne wrote:
> var-const wrote:
> > ldionne wrote:
> > > Maybe we can use `prepend_range(...)` here instead? It would make it the same as what we do for `forward_list`.
> > I copied this implementation from the existing constructor taking 2 iterators. The amount of work between the two possible implementations is comparable, but the implementation relying on insertion contains exception cleanup code that isn't in `emplace_back`. However, despite that, a quick benchmark shows that the difference between the two implementations seems to be within fluctuation (attached below).
> >
> > Given these results, `prepend_range` seems preferable as it's slightly simpler and also consistent with `forward_list` like you mentioned. However, let's discuss whether we want the extra exception cleanup code.
> >
> > `prepend_range` version:
> > ```
> > -----------------------------------------------------------------------------
> > Benchmark Time CPU Iterations
> > -----------------------------------------------------------------------------
> > BM_ConstructRange/list_char/1024 20033 ns 20008 ns 36195
> > BM_ConstructRange/list_size_t/1024 20726 ns 20704 ns 35864
> > BM_ConstructRange/list_string/1024 105972 ns 105897 ns 6653
> > -----------------------------------------------------------------------------
> > Benchmark Time CPU Iterations
> > -----------------------------------------------------------------------------
> > BM_ConstructRange/list_char/1024 20545 ns 20520 ns 30527
> > BM_ConstructRange/list_size_t/1024 20966 ns 20949 ns 35016
> > BM_ConstructRange/list_string/1024 106834 ns 106774 ns 6637
> > -----------------------------------------------------------------------------
> > Benchmark Time CPU Iterations
> > -----------------------------------------------------------------------------
> > BM_ConstructRange/list_char/1024 20083 ns 20069 ns 36502
> > BM_ConstructRange/list_size_t/1024 20106 ns 20090 ns 35770
> > BM_ConstructRange/list_string/1024 105067 ns 104821 ns 6891
> > -----------------------------------------------------------------------------
> > Benchmark Time CPU Iterations
> > -----------------------------------------------------------------------------
> > BM_ConstructRange/list_char/1024 19772 ns 19754 ns 36000
> > BM_ConstructRange/list_size_t/1024 21022 ns 20775 ns 34938
> > BM_ConstructRange/list_string/1024 104036 ns 103966 ns 6803
> > ```
> >
> > `emplace_back` version:
> > ```
> > -----------------------------------------------------------------------------
> > Benchmark Time CPU Iterations
> > -----------------------------------------------------------------------------
> > BM_ConstructRange/list_char/1024 20099 ns 20076 ns 35770
> > BM_ConstructRange/list_size_t/1024 20770 ns 20742 ns 35921
> > BM_ConstructRange/list_string/1024 108025 ns 107948 ns 6793
> > -----------------------------------------------------------------------------
> > Benchmark Time CPU Iterations
> > -----------------------------------------------------------------------------
> > BM_ConstructRange/list_char/1024 19628 ns 19598 ns 36649
> > BM_ConstructRange/list_size_t/1024 19334 ns 19313 ns 36364
> > BM_ConstructRange/list_string/1024 108159 ns 108050 ns 6654
> > -----------------------------------------------------------------------------
> > Benchmark Time CPU Iterations
> > -----------------------------------------------------------------------------
> > BM_ConstructRange/list_char/1024 19960 ns 19945 ns 36955
> > BM_ConstructRange/list_size_t/1024 19963 ns 19943 ns 35697
> > BM_ConstructRange/list_string/1024 108664 ns 108599 ns 6715
> > -----------------------------------------------------------------------------
> > Benchmark Time CPU Iterations
> > -----------------------------------------------------------------------------
> > BM_ConstructRange/list_char/1024 19666 ns 19651 ns 36989
> > BM_ConstructRange/list_size_t/1024 19662 ns 19642 ns 35865
> > BM_ConstructRange/list_string/1024 106818 ns 106769 ns 6660
> > ```
> If `prepend_range` and the other operations have the strong exception safety guarantee, we should make sure to test that.
>
> Regarding whether to use `prepend_range` or not in this constructor, I think we should, but only for consistency, since the strong exception safety guarantee isn't relevant.
Added a test similar to what I recently added for `forward_list` (and also added the new range methods to the `forward_list` test).
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D149830/new/
https://reviews.llvm.org/D149830
More information about the libcxx-commits
mailing list