<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">