<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/162354>162354</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [libc++] Investigate performance discrepancies with the unstable ABI
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            libc++,
            performance
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          ldionne
      </td>
    </tr>
</table>

<pre>
    I did an experiment where I ran all of libc++'s microbenchmarks with the stable and the unstable ABI. I found some interesting functions that seemed to be a lot slower with the stable ABI than the normal ABI. Those are the top ones:

```
Benchmark Normal ABI    Unstable ABI Difference    % Difference
------------------------------------------------------------------------------------------------------- ------------  --------------  ------------- --------------
SetIntersection_Interlaced_Vector_tuple<uint32,_uint64,_uint32>_262144_262144 350759492.31      1002002.85  -349757489.46 -99.71
rng::fill_n(vector<bool>)/262144 948.35          233.88 -714.47          -75.34
rng::fill(vector<bool>)/262144 900.82 235.03        -665.79          -73.91
std::fill(vector<bool>)/262144 874.51          235.02        -639.49 -73.13
rng::copy_n(vector<bool>)_(aligned)/1048576 2840.15         1038.96 -1801.19          -63.42
BM_Copy_SmallTrivialFunctor 1.24 0.49          -0.75          -60.53
BM_Copy_MemPtr 1.14 0.46          -0.68          -59.71
BM_Swap_FuncPtr_MemPtr 3.39            1.40          -1.99 -58.62
BM_Swap_MemFuncPtr_MemPtr 3.34            1.40 -1.94          -57.95
BM_Swap_FuncPtr_MemFuncPtr 3.29 1.40          -1.89          -57.38
BM_Swap_FuncPtr_SmallTrivialFunctor 3.26 1.40          -1.86          -56.97
std::fill(list<int>)/1024 1566.32          674.74        -891.58 -56.92
std::unordered_set<std::string>::insert(value)_(new_value)/8192 78.49           34.30 -44.19          -56.30
BM_Swap_MemPtr_SmallTrivialFunctor 3.18 1.40          -1.78          -55.92
BM_Swap_MemFuncPtr_SmallTrivialFunctor 3.19 1.44          -1.75          -54.87
BM_Copy_FuncPtr 1.14            0.53          -0.61 -53.57
BM_Swap_MemPtr_MemPtr 2.96            1.40 -1.55          -52.61
BM_Swap_MemFuncPtr_MemFuncPtr 2.96 1.40          -1.55          -52.54
BM_Swap_FuncPtr_FuncPtr 2.94 1.40          -1.54 -52.39
BM_Swap_SmallTrivialFunctor_SmallTrivialFunctor 2.93            1.40 -1.53 -52.13
std::vector<std::string>::operator=(const&)_(cheap_elements)/32 27.29           13.44 -13.85          -50.75
rng::find_last(forward_list<int>)_(bail_10%)/1048576 717899.62 366820.69     -351078.93          -48.90
BM_Copy_MemFuncPtr 1.14            0.60          -0.55 -47.96
rng::find_last(forward_list<int>)_(bail_90%)/1048576 677668.97       394148.17 -283520.80 -41.84
std::vector<std::string>::operator=(const&)_(cheap_elements)/1024 719.78          420.44 -299.34          -41.59
BM_ConstructAndDestroy_FuncPtr_Opaque 1.18 0.69          -0.49          -41.32
BM_PushHeap_float_Descending_1 0.70 0.41          -0.29 -40.96
std::flat_multimap<int,_int>::operator=(const&)_(into_cleared_Container)/8192 917.32          550.81        -366.50 -39.95
rng::move_backward(vector<int>)/262144 23288.26        14229.98 -9058.29 -38.90
std::flat_multimap<int,_int>::operator=(const&)_(into_populated_Container)/8192 834.35          512.16        -322.19 -38.62
BM_RangesPopHeap_pair<uint32,_uint32>_1 0.70            0.43 -0.26          -37.84
BM_RangesMakeHeap_uint64_Random_262144 1.64 1.03          -0.62 -37.61
std::flat_multimap<int,_int>::operator=(const&)_(into_partially_populated_Container)/8192 877.22          548.19        -329.03 -37.51
BM_ConstructAndDestroy_SmallTrivialFunctor_Opaque 0.69            0.44 -0.25          -35.84
std::search(deque<int>)_(no_match)/1024 420.60 274.49        -146.11          -34.74
BM_RangesMakeHeap_uint64_Random_16384 1.48            0.97          -0.51 -34.46
BM_MakeHeap_uint64_Random_262144 1.59            1.06 -0.54          -33.73
BM_Invoke_LargeTrivialFunctor 0.67 0.45          -0.23          -33.57
BM_Invoke_SmallTrivialFunctor 0.67 0.45          -0.23 -33.44
BM_MakeHeap_uint64_Random_16384 1.54            1.03 -0.52          -33.38
BM_RangesPushHeap_uint64_Ascending_1 0.70 0.47          -0.23 -32.98
SetIntersection_Front_Set_uint32_16384_16384 359161497.88    241585619.31 -117575878.57          -32.74
BM_RangesMakeHeap_uint64_Random_1024 1.54 1.04          -0.50          -32.43
rng::copy_n(vector<int>)/32768 3269.99         2234.01       -1035.98 -31.68
std::unordered_map<int,_int>::contains(key)_(existent)/0 0.01            0.01 -0.00          -31.52
SetIntersection_Interlaced_Vector_uint64_262144_256 40066146.21 27474909.57   -12591236.64 -31.43
BM_ConstructAndDestroy_MemPtr_Opaque 0.90            0.62 -0.28 -31.27
std::flat_multimap<int,_int>::contains(key)_(non-existent)/0 0.65            0.45 -0.20          -31.25
SetIntersection_Front_Set_uint32_262144_16384 361161254.49 248352975.08  -112808279.40 -31.23
BM_RangesPushHeap_tuple<uint32,_uint64,_uint32>_Random_1 0.70            0.48 -0.22          -31.03
```

Full results here: [comparison.txt](https://github.com/user-attachments/files/22752730/comparison.txt)

This should be pretty easy to reproduce locally as well. I will start filing issues as children of this one for individual investigations.
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJy8WFtv47jZ_jXKDSGCfHm-yEUOG3wBvmkHnW1vBVqiY3Vo0kvRyc6_LyjLjuTYO2mxrWDY1oHPe3reg2iHoX8Jzt1W4r4Sjzd2nzcx3fqujyG4m1Xsftw-o67vkA3I_b5zqd-6kNHbxiWHnlGyAVnvUVwj36_aCu7HjxrQtm9TXLnQbrY2fR_QW583KG8cGrJdeYds6MbTfZgu3N0_Y_SM1nEfOjTErUN9yC65IffhBa33oc19DAPKG5vR4NzWdShHtHLIIh8zGnx8c-mDnLv757IkjNdCTFvrD6J-3cTBIZvceCfHHYrBDRW7q8j4kWT6kLv7oxnoLycAhBD6-0x39Niv1y650LpyqwIxu1KRu_p_c6DFCTq7ia4_W9cVufvm8nNx-uBGZzfjibet65p_uDbH1OT9zruKPez7kBlU8NCUf5If_zGo2C8NSKCcTz-ICaKE4QYwo2g8KCFACGAtEKoZN0oorg3mEtXGYEUrcpfCS4kFu1v33jehAv06alCxh1WMvmK_VGAqeJpkGK4xE-h0AGNYa1QryjFX79drJTDj5_g_RScEa0DABCbsBCWlwMrMsRk2Rfchd5_H1opjQeeaC0zgXQgzmJsRm7K53m3c_bjml6YCbX3J7O4gixKuhZIINCeYvvuJEqaxkaimmlBM58ZIhjkU8n9pHoqob1vr_a-pf-2tfyrZGBOiGDgiRb_3dQQrMYchWLAZzBe3_ZrLSjqulIuVUs9OxcSE-y_Ntze7a4rQrzkdERhmM7EIUczJbDXFxqBaaCxhhvHFbT_C8A8wZTWfq6KwEZdVmf4ihsF81EGbJQrTF1AueZZhkBfg5u4SEht1gW2-H3LFHvqQT1SjBDiiQkrM4B1BKo7VycxaG4qFPuDCHHcfYupccl0zuIJ8ujHk1Bc6_nI47cPgUi6MtH7vJhoG99Yczyt40tQAUnpBGcQ4ZgTVnC8ZKCRmZBm86-6i-qO71IJO4mDWBSpcQRzjyZeIc2oLjrWaUftIhZHbs6NkwGwZwZKiWjAs1EfjJlZCScoLrBQL-YAlvUruozYj1AfXnAMJfoGYMwh-AYKPK5mZrbzgyYveBWzYRfvYiDlWuhPNTgXuGvHiziU7PvJYgW5jGHIFciJgu3F21zjvyuAyHFjIAIEqCTvTgJVY15SNTendNaWcLdtF6BpviwS9junNpq45z7gidmV731BSgVhWYEWVNgZLQExKDQTLgxY1E5QovfBLzTU2ZFk8r5NMkgXJhEA1V9jI_1h781F7qZSUGptjR2WGU64xVagGzQQQrEsiU6z5fzeCY0VT1CxynAMZgwjGLKp6UUiYox_DkNO-zXehe3RDTvGUuM1fd_a3vSuu1egUmKM_F02OU8ymYvJ1P2z-ryi49tHm5tENrQtdH14aighWpHQ5ukACg2pODpF5L97e5ma797nf2t0UDnhopqj83El9yLFpvbOlTj_EkG0fXJoVXUPVovoLQbA-KVYzKbEgqGbm0OpOlNnGV9esbPu9kGU-bswbzDTLAAOtS-c6JhUHMNhoVBsi9Gg4myj95xq-i7u9t_mK6bo0mFlWCwqYynfTAUqxL6odh4W_2fDihq9xN0Z2Z_v0YeY9TLpTjBeJyNkY5XmvZuqQESfoL_a7G7EP43O52sXtcWKmWJYvctY2YASS9M93n025t97_-JkjlcIw51DJfTNzpCk6FyUFvZ5ul5rElHrLrBudyUdnzmsyE2flZXA2tZsKdOd-27vzWhZis7W53D8VjlIoJEGg-Cyta8olpvNUZWU--kTUqGR6bJB6qbtRi_gJOkJyeYD8GQXE2XhL5Agyr2uMYTUN18_hNX53zf_b9OLOmi3BUhVPioU2wJZAx2lkArrUta8ClfWc_6FZRx-Js2mbjMkiYKnMcU6e8vBYYifIuwslVn3UCbDRF15qn1IMufnm8pTGB9UmBZkwVFJuVHl7LG9jnAotJDXl3bWmVAkltNJYzOUx-CRPxjG8uIBiwpfcIEs8_pN3vXnxZaCkRgykKe88xwOAcUzoidyEibESM4qlvjzeX60g7aEWDBXo7-7HlFfu937IrjxclChBIHTJf0KLaWRhGsUCPrXTMLnuuJUgJOKESFmSFGhJXcUNMYdA1BSEocBkqZtFBmfXy880aZ8qjjkr36XMEgwHV4H6N4vtRVeFGOqP7pJiKZiLUfCZu0B8hsOTmyYSS0olBTFWN-BlMDNKYKKLpyhookGZceIu-Oxiqn1uo-dI7EtdUI_WwNIaws721ipy97T3HiU37H0e0MYlV7E7VIn7Nm53NvVDDDj_nitRutcm5924SQdPFTy99HmzX-E2bit42g8u1TZn226mQfFp3XtXfgGUAMVIBU9noGAOOvy66Qc0bOLed2jl0C65nH8gZ4cfKEeU3C7Fbt865GNb-iSyA3pz3mP0jN5679GQbcpo3fs-vKB-GPZuKM-0m953yQUU1ygXETE4tI4J9aHrX_tubz3qw6sbcv9ix_1NfNPdss4wY2_cLVXCaCk5EzebW0rcumVEd9w4TTmjYr2irWidoSuhwN70t0BAUEIUNVxRgUXbdcI5KlvhVobpihO3tb3H3r9ucUwvN6Omt1QCE_zG25Xzw7gVDDDfzi3hrwB2Lq1j2trQunJNPN6k24JUr_YvQ8VJeZEY3rFzn_24sTyDEo_o-WSuQzNE1PVDm9zOhrZ3s-3i-f7wzT752z9gQBE9_dS7FP_p2lzB0yEapfUfzHy9hX8FAAD__z5YPc8">