Nikolas Klauser
e4eccd6a3c
[libc++] Optimize __hash_table::erase(iterator, iterator) (#152471)
Instead of just calling the single element `erase` on every element of
the range, we can combine some of the operations in a custom
implementation. Specifically, we don't need to search for the previous
node or re-link the list every iteration. Removing this unnecessary work
results in some nice performance improvements:
```
-----------------------------------------------------------------------------------------------------------------------
Benchmark old new
-----------------------------------------------------------------------------------------------------------------------
std::unordered_set<int>::erase(iterator, iterator) (erase half the container)/0 457 ns 459 ns
std::unordered_set<int>::erase(iterator, iterator) (erase half the container)/32 995 ns 626 ns
std::unordered_set<int>::erase(iterator, iterator) (erase half the container)/1024 18196 ns 7995 ns
std::unordered_set<int>::erase(iterator, iterator) (erase half the container)/8192 124722 ns 70125 ns
std::unordered_set<std::string>::erase(iterator, iterator) (erase half the container)/0 456 ns 461 ns
std::unordered_set<std::string>::erase(iterator, iterator) (erase half the container)/32 1183 ns 769 ns
std::unordered_set<std::string>::erase(iterator, iterator) (erase half the container)/1024 27827 ns 18614 ns
std::unordered_set<std::string>::erase(iterator, iterator) (erase half the container)/8192 266681 ns 226107 ns
std::unordered_map<int, int>::erase(iterator, iterator) (erase half the container)/0 455 ns 462 ns
std::unordered_map<int, int>::erase(iterator, iterator) (erase half the container)/32 996 ns 659 ns
std::unordered_map<int, int>::erase(iterator, iterator) (erase half the container)/1024 15963 ns 8108 ns
std::unordered_map<int, int>::erase(iterator, iterator) (erase half the container)/8192 136493 ns 71848 ns
std::unordered_multiset<int>::erase(iterator, iterator) (erase half the container)/0 454 ns 455 ns
std::unordered_multiset<int>::erase(iterator, iterator) (erase half the container)/32 985 ns 703 ns
std::unordered_multiset<int>::erase(iterator, iterator) (erase half the container)/1024 16277 ns 9085 ns
std::unordered_multiset<int>::erase(iterator, iterator) (erase half the container)/8192 125736 ns 82710 ns
std::unordered_multimap<int, int>::erase(iterator, iterator) (erase half the container)/0 457 ns 454 ns
std::unordered_multimap<int, int>::erase(iterator, iterator) (erase half the container)/32 1091 ns 646 ns
std::unordered_multimap<int, int>::erase(iterator, iterator) (erase half the container)/1024 17784 ns 7664 ns
std::unordered_multimap<int, int>::erase(iterator, iterator) (erase half the container)/8192 127098 ns 72806 ns
```
2025-08-25 21:45:20 +02:00
..
2025-07-25 16:27:34 +02:00
2025-05-28 12:04:51 -04:00
2025-06-11 14:31:13 +02:00
2025-05-28 12:04:51 -04:00
2025-07-05 18:11:58 +02:00
2025-04-09 23:47:57 +02:00
2025-07-05 18:11:36 +02:00
2025-05-28 12:04:51 -04:00
2025-07-15 10:45:37 -04:00
2025-07-04 10:56:38 +02:00
2025-03-27 11:34:38 +01:00
2025-07-31 15:25:18 -04:00
2025-06-10 05:54:15 +02:00
2025-08-05 22:11:27 +03:00
2025-08-10 01:11:20 +08:00
2025-07-05 18:11:58 +02:00
2025-07-20 00:36:29 +08:00
2025-07-05 17:38:45 +01:00
2025-07-29 16:40:06 +08:00
2025-07-20 11:23:31 +02:00
2025-08-07 09:18:31 +02:00
2025-04-09 23:47:57 +02:00
2025-08-18 18:04:45 +03:00
2025-07-16 07:39:17 -04:00
2025-08-05 17:47:11 +08:00
2025-06-11 14:31:13 +02:00
2025-08-23 07:58:37 +02:00
2025-08-05 09:48:46 +02:00
2025-07-20 11:23:31 +02:00
2025-07-16 09:42:09 +02:00
2025-06-21 09:58:45 +02:00
2025-07-05 18:11:58 +02:00
2025-05-28 12:04:51 -04:00
2025-05-28 12:04:51 -04:00
2025-08-13 19:21:13 -04:00
2025-04-13 08:40:21 -04:00
2025-05-07 10:54:34 -04:00
2025-01-10 15:21:58 -05:00
2025-05-28 12:04:51 -04:00
2025-07-20 11:23:31 +02:00
2025-08-05 09:48:46 +02:00
2025-08-12 20:31:00 +02:00
2025-07-20 11:23:31 +02:00
2025-04-09 23:47:57 +02:00
2025-07-29 10:30:37 +02:00
2025-07-05 18:11:58 +02:00
2025-07-17 23:23:04 +02:00
2025-07-31 02:52:17 -07:00
2025-04-18 20:57:05 -04:00
2025-07-31 15:17:56 -04:00
2025-07-18 11:06:27 -04:00
2025-08-25 21:45:20 +02:00
2025-07-09 16:32:01 +02:00
2025-07-24 13:39:48 -04:00
2025-02-18 12:12:23 +01:00
2025-07-10 09:21:46 +02:00
2025-05-08 16:35:00 -04:00
2025-08-22 13:52:36 -04:00
2025-05-28 12:04:51 -04:00
2025-07-14 09:56:19 -04:00
2025-04-19 07:12:43 -04:00
2025-06-02 13:13:57 -04:00
2025-05-08 16:35:00 -04:00
2025-01-17 14:22:40 -05:00
2025-07-16 00:44:16 +02:00
2025-04-09 15:00:46 +02:00
2025-07-20 11:23:31 +02:00
2024-12-21 13:01:48 +01:00
2025-01-08 11:12:59 -05:00
2024-12-21 13:01:48 +01:00
2024-12-21 13:01:48 +01:00
2024-12-21 13:01:48 +01:00
2024-12-21 13:01:48 +01:00
2025-04-09 15:00:46 +02:00
2025-06-11 08:43:23 +02:00
2024-12-21 13:01:48 +01:00
2025-01-08 11:12:59 -05:00
2024-12-21 13:01:48 +01:00
2024-12-21 13:01:48 +01:00
2025-08-07 09:18:31 +02:00
2025-05-08 16:48:57 -04:00
2025-05-28 12:04:51 -04:00
2025-04-09 15:00:46 +02:00
2025-06-24 13:56:17 -04:00
2024-12-21 13:01:48 +01:00
2025-04-09 15:00:46 +02:00
2025-05-28 12:04:51 -04:00
2025-04-09 15:00:46 +02:00
2024-12-21 13:01:48 +01:00
2024-12-21 13:01:48 +01:00
2025-01-08 11:12:59 -05:00
2024-12-21 13:01:48 +01:00
2025-01-08 11:12:59 -05:00
2024-12-21 13:01:48 +01:00
2024-12-21 13:01:48 +01:00
2024-12-21 13:01:48 +01:00
2024-12-21 13:01:48 +01:00
2024-12-21 13:01:48 +01:00
2025-01-08 11:12:59 -05:00
2024-12-21 13:01:48 +01:00
2024-12-21 13:01:48 +01:00
2024-12-21 13:01:48 +01:00
2025-02-27 17:47:34 +01:00
2024-12-21 13:01:48 +01:00
2025-07-25 16:27:34 +02:00
2024-12-21 13:01:48 +01:00
2024-12-21 13:01:48 +01:00
2025-04-09 15:00:46 +02:00
2025-04-09 15:00:46 +02:00
2024-12-21 13:01:48 +01:00
2025-04-09 15:00:46 +02:00
2025-07-06 12:25:18 +01:00
2025-07-06 12:25:18 +01:00
2024-12-21 13:01:48 +01:00
2025-04-09 15:00:46 +02:00
2025-06-21 09:58:45 +02:00
2025-07-17 23:50:39 +01:00
2025-07-06 17:32:59 +01:00
2025-07-20 11:23:31 +02:00
2025-05-28 12:04:51 -04:00
2024-12-21 13:01:48 +01:00
2025-07-05 18:11:58 +02:00
2025-06-10 14:12:46 -04:00
2025-04-09 23:47:57 +02:00
2024-12-21 13:01:48 +01:00
2025-07-05 18:11:58 +02:00
2025-08-18 13:26:13 +08:00
2025-04-09 15:00:46 +02:00
2025-07-18 11:26:36 -04:00
2025-06-18 12:13:50 -04:00
2025-07-05 18:11:58 +02:00
2025-08-22 13:52:36 -04:00
2025-08-05 17:47:11 +08:00
2025-06-08 21:58:36 +00:00
2025-04-14 17:33:57 -04:00
2025-04-09 15:00:46 +02:00
2025-08-07 09:18:31 +02:00
2025-07-20 11:23:31 +02:00
2024-12-21 13:01:48 +01:00
2025-04-09 15:00:46 +02:00
2025-04-05 13:46:11 +02:00
2025-08-18 18:04:45 +03:00
2025-07-05 18:11:58 +02:00
2025-07-19 11:12:20 +02:00
2025-06-04 19:58:25 +08:00
2024-12-21 13:01:48 +01:00
2025-07-20 09:13:59 +01:00
2025-04-09 23:47:57 +02:00
2025-07-21 20:41:00 +08:00
2025-07-20 11:23:31 +02:00
2025-04-09 15:00:46 +02:00
2025-08-22 13:52:36 -04:00
2025-07-05 18:07:07 +02:00
2025-04-09 15:00:46 +02:00
2025-04-09 23:47:57 +02:00
2025-07-05 18:11:58 +02:00
2025-04-09 23:47:57 +02:00
2025-01-17 14:22:40 -05:00
2024-12-21 13:01:48 +01:00
2024-12-21 13:01:48 +01:00
2025-05-28 12:04:51 -04:00
2024-12-23 07:33:26 -08:00
2025-06-19 10:37:18 +02:00
2025-04-09 15:00:46 +02:00
2025-08-20 11:09:39 -04:00
2025-08-23 07:58:37 +02:00
2025-08-14 09:24:20 +02:00
2024-12-21 13:01:48 +01:00
2025-05-28 12:04:51 -04:00
2025-06-10 14:12:46 -04:00
2025-04-19 07:12:43 -04:00
2024-12-21 13:01:48 +01:00
2024-12-21 13:01:48 +01:00
2025-08-23 09:57:07 +02:00
2025-07-05 18:11:36 +02:00
2025-04-09 23:47:57 +02:00
2025-05-28 12:04:51 -04:00
2024-12-21 13:01:48 +01:00
2025-08-22 11:24:28 +02:00
2025-08-22 11:24:28 +02:00
2025-03-25 18:31:57 +01:00
2025-05-28 12:04:51 -04:00
2025-07-20 11:23:31 +02:00
2025-04-19 07:12:43 -04:00
2025-08-18 18:04:45 +03:00
2024-12-23 07:33:26 -08:00
2024-12-21 13:01:48 +01:00