Partially inline basic_string copy constructor in UNSTABLE
authorMartijn Vels <mvels@google.com>
Wed, 4 Mar 2020 22:52:46 +0000 (17:52 -0500)
committerMartijn Vels <mvels@google.com>
Wed, 4 Mar 2020 22:52:46 +0000 (17:52 -0500)
commitb019c5c0372eb08800327efb5e7955ce918b75d1
treedc64b7b93170b69f42d2dafcff061bc09a8ed73d
parent45499f3801d8a00919deaf38c801885d8e75b942
Partially inline basic_string copy constructor in UNSTABLE

    Summary:
    This is a recommit of https://reviews.llvm.org/D73223 where the added function accidentally ended up inside an idef block.

    This change splits the copy constructor up inlining short initialization, and explicitly outlining long initialization into __init_copy_ctor_external() which is the externally instantiated slow path.

    For unstable ABI, this has the following changes:

    remove basic_string(const basic_string&)
    remove basic_string(const basic_string&, const Allocator&)
    add __init_copy_ctor_external(const value_type*, size_type)
    Quick local benchmark for Copy:

    Master
    ```
    ---------------------------------------------------------------
    Benchmark                    Time             CPU   Iterations
    ---------------------------------------------------------------
    BM_StringCopy_Empty       3.50 ns         3.51 ns    199326720
    BM_StringCopy_Small       3.50 ns         3.51 ns    199510016
    BM_StringCopy_Large       15.7 ns         15.7 ns     45230080
    BM_StringCopy_Huge        1503 ns         1503 ns       464896
    ```
    With this change
    ```
    ---------------------------------------------------------------
    Benchmark                    Time             CPU   Iterations
    ---------------------------------------------------------------
    BM_StringCopy_Empty       1.99 ns         2.00 ns    356471808
    BM_StringCopy_Small       3.29 ns         3.30 ns    203425792
    BM_StringCopy_Large       13.3 ns         13.3 ns     52948992
    BM_StringCopy_Huge        1472 ns         1472 ns       475136
    ```

    Subscribers: libcxx-commits

    Tags: #libc

    Differential Revision: https://reviews.llvm.org/D75639
libcxx/include/__string
libcxx/include/string
libcxx/test/libcxx/strings/basic.string/string.cons/copy_shrunk_long.pass.cpp [new file with mode: 0644]