From fd8cb9b2aa5b3ab6f15425358c38b7644eba7ded Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ion=20Gazta=C3=B1aga?= Date: Fri, 5 Jun 2026 23:46:23 +0200 Subject: [PATCH] Add "hub" to documentation --- doc/Jamfile.v2 | 10 + doc/container.qbk | 1099 +++++++++++++++++++++++++++++ doc/images/hub_250_256.png | Bin 0 -> 2850 bytes doc/images/hub_250_512.png | Bin 0 -> 3531 bytes doc/images/hub_500_1024.png | Bin 0 -> 6002 bytes doc/images/hub_500_512.png | Bin 0 -> 3380 bytes doc/images/hub_500_768.png | Bin 0 -> 4062 bytes doc/images/hub_data_structure.png | Bin 0 -> 5781 bytes doc/images/hub_natvis.png | Bin 0 -> 16262 bytes 9 files changed, 1109 insertions(+) create mode 100644 doc/images/hub_250_256.png create mode 100644 doc/images/hub_250_512.png create mode 100644 doc/images/hub_500_1024.png create mode 100644 doc/images/hub_500_512.png create mode 100644 doc/images/hub_500_768.png create mode 100644 doc/images/hub_data_structure.png create mode 100644 doc/images/hub_natvis.png diff --git a/doc/Jamfile.v2 b/doc/Jamfile.v2 index ebe4131..3af2274 100644 --- a/doc/Jamfile.v2 +++ b/doc/Jamfile.v2 @@ -76,6 +76,16 @@ boostbook standalone xhtml:img.src.path=../../../../doc/html/ generate.section.toc.level=3 chunk.first.sections=1 + # Emit a separate HTML file for each level-2 section (e.g. the + # individual non-standard containers such as stable_vector or hub) + # instead of inlining them into their parent's single HTML page. + chunk.section.depth=2 + # In-page sub-index (TOC) at the top of every section page is produced + # by BoostBook's default generate.toc ("section toc") together with + # generate.section.toc.level (above). toc.section.depth bounds how many + # nested levels each in-page sub-index lists; toc.max.depth caps depth. + toc.section.depth=2 + toc.max.depth=2 pdf:img.src.path=$(images_location)/ autodoc pdf:boost.url.prefix=http://www.boost.org/doc/libs/release/doc/html diff --git a/doc/container.qbk b/doc/container.qbk index ed8f2e4..3691c21 100644 --- a/doc/container.qbk +++ b/doc/container.qbk @@ -593,6 +593,1105 @@ to control block size and other parameters. [endsect] +[section:hub ['hub]] + +[section:hub_introduction Introduction] + + +`boost::container::hub` is a container with constant-time insertion and erasure and ['element stability]: +pointers/iterators to an element remain valid until the element is erased. + + +[c++] + + #include + #include + + int main() + { + boost::container::hub h; + + // Insert some elements and keep an iterator to one of them + for(int i = 0; i < 100; ++i) h.insert(i); + auto it = h.insert(100); + for(int i = 101; i < 200; ++i) h.insert(i); + + // Erase some of the elements + erase_if(h, [](int x) { return x % 2 != 0;}); + assert(*it = 100); // iterator still valid + + // Insert many more elements + for(int i = 200; i < 10000; ++i) h.insert(i); + assert(*it = 100); // iterator still valid + } + + +The observant reader may retort that `std::list` is also stable and provides constant-time insertion/erasure: the key +difference is that `boost::container::hub` is orders of magnitude faster because memory is allocated in chunks of +contiguous elements, which amortizes allocation costs and provides some degree of cache locality. An important +tradeoff when using `boost::container::hub` is the fact that the user can't control the position where a new element +will be inserted: `boost::container::hub` reuses the memory addresses of previously erased elements to maximize +performance and keep the data structure as compact as possible. + + +`boost::container::hub` is very similar but not entirely equivalent to C++26 [@https://eel.is/c++draft/sequences#hive +std::hive] (hence the different naming). Consult the section "Deviations from std::hive" for details. + + +The primary use case for `boost::container::hub`, `std::hive` and similar containers such as ['slot maps] is in +high-performance scenarios where elements are created and destroyed frequently, insertion order is not relevant and +pointer/iterator stability is required: game entity systems, particle simulation and high-frequency trading come to +mind. + + +[endsect] + +[section:hub_getting_started Getting started] + + +`boost::container::hub` depends on Boost. Consult the website +[@https://www.boost.org/doc/user-guide/getting-started.html section] on how to install the entire Boost project or +only the exact dependencies of `boost::container::hub` (`assert`, `config`, `core` and `throw_exception`). + + +This is a header-only library, so no additional build phase is needed. C++11 or later required. The library has been +verified to work with GCC 4.8, Clang 3.5 and Visual Studio 2017/MSVC 14.1 (and later versions of those). You can +check that your environment is correctly set up by compiling the example program shown above. + + +[endsect] + +[section:hub_tutorial Tutorial] + + +If you're familiar with STL containers such as `std::list` and `std::vector`, getting used to `boost::container::hub` +is entirely straightforward as its API is mostly analogous. The key characteristics that set this container apart are: + + +* Pointers and iterators to an element remain valid as long as the element is not erased. `hub` will ['not] reallocate + elements as it grows in size. +* Insertion and erasure are constant-time and very fast. Memory is allocated in element blocks with fixed capacity (64 + elements per block in this implementation), and the container keeps track of available positions, including those of + erased elements, to use them for further insertions and keep the number of memory allocations to the minimum + possible. + +[section:hub_unordered_insertion Unordered insertion] + + +As a result of its memory reuse policy, users generally can't control the resulting insertion order in a `hub`: + + +[c++] + + boost::container::hub h = {0, 1, 2}; + h.erase(h.begin()); + h.insert({3, 4, 5}); + for(const auto& x: h) std::cout << x << " "; + +Output + +[pre +3 1 2 4 5 +] + + +In the example, `h.erase(h.begin())` generates an available position where `0` used to be, and this is where `3` goes +in when inserting `{3, 4, 5}`, rather than after `2`. + + +[endsect] + +[section:hub_capacity Capacity] + + +`reserve` can be used to preallocate memory blocks before insertion: + + +[c++] + + boost::container::hub h; + h.reserve(1000); // capacity() is rounded to the next multiple of 64 (1024) + for(int i = 0; i < 500; ++i) h.insert(i); // won't allocate as capacity() >= 500 + + +In the example, `h` ends up with 8 non-empty blocks and 8 empty (also called ['reserved]) blocks: + + +[$../../libs/container/doc/images/hub_500_1024.png [align center]] + + +Empty blocks can be deallocated as follows: + + +[c++] + + h.trim_capacity(750); // capacity() rounded up to next multiple of 64 no less than 750 + + +[$../../libs/container/doc/images/hub_500_768.png [align center]] + + +or with: + + +[c++] + + h.trim_capacity(); // equivalent to trim_capacity(0) + + +[$../../libs/container/doc/images/hub_500_512.png [align center]] + + +Obviously, in this example `h.trim_capacity()` doesn't bring the capacity down to zero because `h` is not empty. + + +After erasures, a `hub` may contain "holes" or available positions in non-empty blocks that can't be trimmed further: + + +[c++] + + erase_if(h, [](int x) { return x % 2 != 0; }); // erase odd values + + +[$../../libs/container/doc/images/hub_250_512.png [align center]] + + +`shrink_to_fit` reallocates elements so that they occupy the minimum possible number of blocks, and then deallocates +the remaining blocks: + + +[c++] + + h.shrink_to_fit(); + + +[$../../libs/container/doc/images/hub_250_256.png [align center]] + + +If we print the elements of `h`: + + +[c++] + + for(const auto& x: h) std::cout << x << " "; + +we get: + +[pre +0 126 2 124 4 122 6 120 8 118 10... +] + +Note how `shrink_to_fit` has reallocated the elements `126`, `124`, etc. so that they go in the available positions +previously occupied by odd values. + + +[endsect] + +[section:hub_std_hive_operations `std::hive` operations] + + +`boost::container::hub` provides operations specific to C++26 `std::hive`: + + +[c++] + + boost::container::hub h1 = {0, 2, 3, 4, 6}, + h2 = {1, 4, 6, 7, 9}; + h1.splice(h2); // transfer non-empty blocks from h2 to h1 (no reallocation) + h1.sort(); // sorts the values (reallocates) + h1.unique(); // erase repeated, consecutive values + + +A slightly more interesting operation is `get_iterator`: + + +[c++] + + boost::container::hub h; + //... + int* p = std::addressof(*h.insert(50)); + //... + boost::container::hub::iterator it = h.get_iterator(p); + h.erase(it); // erase the element (couldn't be done directly with p) + + +`get_iterator` returns an iterator after a pointer to a valid element of the `hub`. This can be useful in legacy +scenarios where elements of the container are externally tracked via pointers, or for encapsulation purposes, or to +save memory (`hub` iterators typically are 16 bytes in size). Note, however, that `get_iterator` is not cheap: +execution is linear on the number of non-empty blocks. + + +[endsect] + +[section:hub_visitation Visitation] + + +The following, typical processing loop: + + +[c++] + + boost::container::hub h; + //... + for(auto& x: h) x *= 2; + + +can also be written as: + + +[c++] + + // Note this is _not_ std::for_each + for_each(h, [](auto& x) { x *= 2; }); + + +Although functionally equivalent to the classical loop, `for_each` is generally faster as it is implemented with a +combination of loop unrolling and prefetching techniques. Speedups can be as high as 1.75x. Consult the performance +section for a comparison of execution speeds. Consult the reference for documentation on variations of `for_each` +(`for_each(first, last, f)`, `for_each_while(h, f)`, `for_each_while(first, last, f`). + + +[endsect] + +[section:hub_debugging Debugging] + +[section:hub_visual_studio_natvis Visual Studio Natvis] + + +Add the [@extra/boost_hub.natvis boost_hub.natvis] visualizer to your project to allow for user-friendly inspection of +`boost::container::hub`s. + + +[$../../libs/container/doc/images/hub_natvis.png [align center]] + + +[endsect] + +[section:hub_gdb_pretty_printer GDB Pretty-Printer] + + +`boost::container::hub` comes with a dedicated +[@https://sourceware.org/gdb/current/onlinedocs/gdb.html/Pretty-Printing.html#Pretty-Printing pretty-printer] for +visual inspection when debugging with GDB: + + +[pre +(gdb) print h +$1 = boost::container::hub with {size = 7, capacity = 1024} = {0, 23, 1, 100, 10, 2, 42} +(gdb) print h[3] +$2 = 100 +] + + +Remember to enable pretty-printing in GDB (typically a one-time setup): + + +[pre +(gdb) set print pretty on +] + + +And load the [@extra/boost_hub_printers.py boost_hub_printers.py] script before variable inspection: + + +[pre +(gdb) source /extra/boost_hub_printers.py +] + + +[endsect] + +[endsect] + +[endsect] + +[section:hub_motivation_for_a_novel_data_structure Motivation for a novel data structure] + + +`std::hive` was +[@https://herbsutter.com/2025/02/17/trip-report-february-2025-iso-c-standards-meeting-hagenberg-austria accepted into +C++26] in February 2025 and +Matthew Bentley's [@https://github.com/mattreecebentley/plf_hive plf::hive] is the de facto reference implementation. +Two important decisions in the [@https://plflib.org/colony.htm#details design of plf::hive] are: + + +* As the size of the container grows, newly allocated element blocks get larger up to a limit specified by the user + and capped internally. This is done to increase cache locality while keeping memory usage reasonable for small + containers. +* Efficient iteration and location of available slots are served by a combination of a + [@https://plflib.org/matt_bentley_-_the_low_complexity_jump-counting_pattern.pdf skipfield array] and a list of + erased elements (the latter embedded into the memory of the erased elements themselves). + +This structure requires significant bookkeeping and introduces a minimum memory overhead of at least one (and +typically two) bytes per slot. The question arises of whether we can come up with a more efficient alternative design. + + +The internal data structure of `boost::container::hub` is as follows: + + +[$../../libs/container/doc/images/hub_data_structure.png [align center]] + + +* Active blocks are kept in an intrusive doubly-linked list. Block size is fixed to 64 elements. +* Each block points to its associated element array and maintains a bitmask of used slots. The reason why a block size + of 64 has been chosen is because the resulting associated bitmask is a 64-bit word, for which most CPU architectures + provide fast bit manipulation instructions. +* ['Available] blocks (those with at least one free slot) are kept in another intrusive doubly-linked list (not shown + in the diagram). + +Blocks then hold five pointers (two intrusive lists plus a pointer to the element array) and a mask of type +`std::uint64_t`, yielding a total overhead of 6 bits per slot (in 64-bit mode). Locating an occupied (resp. free) +slot in a given block can be effectively accomplished in constant time with +[@https://en.cppreference.com/w/cpp/numeric/countr_zero.html std::countr_zero(mask)] (resp. `std::countr_one(mask)`). +It is not hard to see that insertion, erasure and iterator increment can also be implemented in (non-amortized) +constant time. + + +[endsect] + +[section:hub_deviations_from_std_hive Deviations from `std::hive`] + + +`boost::container::hub` does not conform to the specification of `std::hive` in a few aspects: + + +* Minimum and maximum block sizes cannot be specified and are fixed (currently at 64 ). Although the standard permits + this design choice, users coming from other implementations of `std::hive` may find it surprising. Accordingly, we + have omitted the following, which would otherwise serve no functional purpose: `hive_limits` construction, + `block_capacity_limits`, `block_capacity_default_limits`, `block_capacity_hard_limits`, `is_within_hard_limits`, + `reshape`. +* Iterators are not [@https://en.cppreference.com/w/cpp/utility/compare/three_way_comparable.html + three_way_comparable]: Making them so would require extra block metadata and bookkeeping, and this overhead, which + is quite significant for small block sizes as used by `boost::container::hub`, was not deemed worth imposing over + the potential usefulness of having ordered iterators. +* `get_iterator` is not `noexcept`. +* No operations are marked `constexpr`. + +The following functionality is specific to `boost::container::hub`: + + +* As cache locality is relatively poorer than that of other implementations of `std::hive` (like `plf::hive`), which + can use much larger blocks, iteration performance may suffer. To partially alleviate this, ['visitation] functions + `for_each`, and `for_each_while` are provided: these are more performant than regular external iteration thanks to + a combination of unrolling and prefetching techniques. +* `erase_void` is an alternative to `erase` that does not return an iterator to the next element, thus saving some + potential runtime overhead. +* The `end` iterator is guaranteed to be stable and non-transferable, whereas for `std::hive` the `end` iterator is + allowed to invalidate upon insertion or erasure of the last element (briefly put, `boost::container::hub::end` + behaves like `std::list::end` whereas `std::hive::end` behaves like `std::vector::end`). Technically, this is not a + non-conformance but rather an extension to the specification of `std::hive`. + +[endsect] + +[section:hub_performance Performance] + + +Benchmarks of `boost::container::hub` vs. `plf::hive` are run as GitHub Actions jobs in a +[@https://github.com/boostorg/boost_hub_benchmarks dedicated repo]. Execution times for the following scenarios are +measured: + + +* Insertion of ['n] elements in the container, random erasure of elements with probability ['r] and insertion of + elements until the size of the container becomes ['n] again. +* The above, plus destruction of the container. +* range-based `for` loop traversal of the container after insertion of ['n] elements and random erasure with + probability ['r]. +* Visitation-based `for_each` traversal for `boost::container::hub` vs. range `for` traversal for `plf::hive`. +* Sorting the container after insertion of ['n] elements and random erasure with probability ['r]. + +Benchmarks cover all the combinations of + + +* ['n] = 10[super 3], 10[super 4], ..., 10[super 7], +* ['r] = 0, 0.1, ..., 0.9, +* `sizeof(element)` = 16, 32, 64, 80. + +Values show the relative execution time of `plf::hive` with respect to `boost::container::hub` (e.g. "1.2" means +`boost::container::hub` is 1.2 times faster than `plf::hive`). + + +[section:hub_gcc_15_x64 GCC 15, x64] + +[pre + ---------------------------------------------------------------------------------------------------------------------------------------- + | sizeof(element): 16 | + ---------------------------------------------------------------------------------------------------------------------------------------- + | insert, erase, insert | ins, erase, ins, destroy | range for | for_each | sort | + ---------------------------------------------------------------------------------------------------------------------------------------- + | container size | container size | container size | container size | container size | +----------------------------------------------------------------------------------------------------------------------------------------------------- +| erase rate | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | +----------------------------------------------------------------------------------------------------------------------------------------------------- +| 0 | 1.27 2.43 1.22 1.38 1.47 | 1.28 1.18 1.19 1.27 1.49 | 1.04 1.03 1.03 1.03 1.04 | 1.79 1.96 1.98 1.97 1.81 | 1.01 1.00 1.00 1.00 1.00 | +| 0.1 | 1.24 1.22 1.26 1.90 1.59 | 1.25 1.18 1.23 1.55 1.56 | 1.04 1.04 1.04 1.03 1.02 | 1.70 1.76 1.76 1.75 1.63 | 1.00 0.98 1.00 0.99 0.97 | +| 0.2 | 1.21 1.25 1.34 2.00 1.72 | 1.21 1.20 1.30 1.81 1.72 | 1.06 1.02 1.04 1.02 1.02 | 1.65 1.73 1.74 1.72 1.54 | 1.00 0.98 1.00 0.98 0.97 | +| 0.3 | 1.23 1.30 1.44 1.78 1.95 | 1.26 1.26 1.41 1.99 1.90 | 1.03 1.01 1.01 1.00 1.00 | 1.74 1.72 1.68 1.68 1.43 | 1.00 0.99 1.00 0.98 0.97 | +| 0.4 | 1.32 1.37 1.54 1.81 2.06 | 1.34 1.30 1.52 1.74 2.02 | 1.00 1.00 1.00 0.99 0.97 | 1.86 1.76 1.64 1.64 1.29 | 1.00 0.98 0.99 0.98 0.96 | +| 0.5 | 1.38 1.52 1.64 1.86 2.17 | 1.40 1.39 1.61 1.81 2.21 | 1.13 0.99 0.97 0.97 0.96 | 1.80 1.82 1.60 1.60 1.17 | 0.99 0.99 0.99 0.96 0.95 | +| 0.6 | 1.46 1.91 1.76 1.89 2.42 | 1.48 1.84 1.72 1.92 2.34 | 1.14 0.99 0.96 0.96 0.95 | 1.80 1.92 1.63 1.57 1.08 | 0.98 1.01 0.99 0.96 0.94 | +| 0.7 | 1.47 1.92 1.88 2.12 2.48 | 1.52 1.83 1.83 2.04 2.45 | 1.31 1.12 0.94 0.93 0.96 | 1.84 2.02 1.67 1.50 1.01 | 0.98 1.32 0.97 0.94 0.91 | +| 0.8 | 1.69 2.09 2.02 2.12 2.56 | 1.55 1.88 1.92 2.02 2.53 | 1.42 1.53 1.03 0.91 0.98 | 1.84 2.05 1.46 1.32 0.92 | 0.94 0.99 0.95 0.91 0.86 | +| 0.9 | 1.55 2.01 2.16 2.17 2.62 | 1.58 1.76 1.95 2.26 2.59 | 1.35 1.63 1.08 0.76 0.88 | 1.63 1.96 1.33 1.08 0.95 | 0.87 0.84 0.91 0.83 0.80 | +----------------------------------------------------------------------------------------------------------------------------------------------------- +] + +[pre + ---------------------------------------------------------------------------------------------------------------------------------------- + | sizeof(element): 32 | + ---------------------------------------------------------------------------------------------------------------------------------------- + | insert, erase, insert | ins, erase, ins, destroy | range for | for_each | sort | + ---------------------------------------------------------------------------------------------------------------------------------------- + | container size | container size | container size | container size | container size | +----------------------------------------------------------------------------------------------------------------------------------------------------- +| erase rate | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | +----------------------------------------------------------------------------------------------------------------------------------------------------- +| 0 | 1.02 2.38 2.48 2.20 1.59 | 1.05 0.95 0.97 2.34 1.62 | 1.07 1.05 1.03 0.98 0.97 | 1.87 1.92 1.95 1.30 1.15 | 1.05 1.00 1.01 1.52 1.95 | +| 0.1 | 1.04 1.02 1.09 2.05 1.68 | 1.03 0.97 1.03 2.17 1.68 | 1.09 1.05 1.03 1.05 0.97 | 1.75 1.76 1.74 1.32 1.11 | 1.03 0.99 1.00 1.33 1.87 | +| 0.2 | 1.04 1.03 1.15 2.18 1.87 | 1.02 0.98 1.10 2.24 1.89 | 1.11 1.04 1.03 0.97 0.95 | 1.78 1.77 1.69 1.24 1.13 | 1.03 0.99 0.99 1.27 1.80 | +| 0.3 | 1.05 1.08 1.23 2.19 1.94 | 1.02 1.04 1.18 2.29 2.05 | 1.07 1.04 1.03 1.01 0.95 | 1.81 1.75 1.69 1.19 1.09 | 1.03 0.99 0.99 1.21 1.74 | +| 0.4 | 1.11 1.11 1.30 2.26 2.03 | 1.09 1.08 1.26 2.50 2.16 | 1.04 1.03 1.02 0.96 0.93 | 1.89 1.79 1.67 1.09 1.01 | 1.06 0.99 0.99 1.14 1.67 | +| 0.5 | 1.16 1.19 1.40 2.31 2.11 | 1.12 1.20 1.35 2.49 2.29 | 1.23 1.03 1.02 0.91 0.91 | 1.97 1.92 1.65 1.09 0.97 | 1.01 1.00 0.99 1.05 1.59 | +| 0.6 | 1.22 1.45 1.50 2.43 2.38 | 1.23 1.50 1.46 2.70 2.35 | 1.28 1.06 1.00 0.95 0.92 | 1.99 1.89 1.47 1.08 0.92 | 1.02 1.01 0.99 1.03 1.54 | +| 0.7 | 1.36 1.62 1.62 2.44 2.29 | 1.34 1.58 1.58 2.65 2.45 | 1.48 1.18 0.99 0.91 0.91 | 1.97 1.84 1.28 1.09 0.89 | 0.97 1.56 0.98 0.89 1.48 | +| 0.8 | 1.28 1.71 1.78 2.60 2.49 | 1.25 1.65 1.70 2.74 2.54 | 1.44 1.50 0.96 0.88 0.91 | 1.87 1.90 1.36 1.39 1.01 | 0.92 1.03 0.96 0.83 1.35 | +| 0.9 | 1.55 1.68 1.88 2.64 2.51 | 1.52 1.55 1.81 2.80 2.58 | 1.37 1.63 1.08 0.75 0.86 | 1.66 2.08 1.39 1.19 1.01 | 0.78 0.78 0.90 0.83 1.08 | +----------------------------------------------------------------------------------------------------------------------------------------------------- +] + +[pre + ---------------------------------------------------------------------------------------------------------------------------------------- + | sizeof(element): 64 | + ---------------------------------------------------------------------------------------------------------------------------------------- + | insert, erase, insert | ins, erase, ins, destroy | range for | for_each | sort | + ---------------------------------------------------------------------------------------------------------------------------------------- + | container size | container size | container size | container size | container size | +----------------------------------------------------------------------------------------------------------------------------------------------------- +| erase rate | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | +----------------------------------------------------------------------------------------------------------------------------------------------------- +| 0 | 1.04 3.20 2.65 2.99 1.94 | 1.04 0.97 1.00 1.04 1.93 | 1.08 1.05 1.04 0.92 0.95 | 1.85 1.70 1.84 1.01 0.98 | 1.01 1.00 1.01 1.54 1.83 | +| 0.1 | 1.04 1.05 1.11 2.69 1.92 | 1.04 0.99 1.06 1.52 1.94 | 1.12 1.08 1.08 0.90 0.93 | 1.88 1.72 1.74 1.00 0.94 | 1.01 0.99 1.00 1.48 1.73 | +| 0.2 | 1.03 1.08 1.20 2.75 2.11 | 1.03 1.01 1.13 1.69 2.10 | 1.17 1.09 1.07 0.89 0.90 | 1.84 1.55 1.50 0.97 0.91 | 1.02 1.00 1.01 1.32 1.65 | +| 0.3 | 1.06 1.14 1.26 2.81 2.21 | 1.04 1.08 1.21 1.78 2.26 | 1.16 1.10 1.09 0.91 0.91 | 1.82 1.49 1.38 1.03 0.89 | 1.02 0.99 1.00 1.24 1.60 | +| 0.4 | 1.13 1.26 1.33 2.71 2.29 | 1.14 1.13 1.29 1.74 2.38 | 1.15 1.06 1.02 0.89 0.91 | 1.81 1.44 1.26 1.03 0.89 | 1.01 0.98 1.01 1.17 1.56 | +| 0.5 | 1.14 1.26 1.40 2.58 2.40 | 1.14 1.22 1.37 1.77 2.41 | 1.31 1.03 0.96 0.99 0.92 | 1.78 1.45 1.20 0.91 0.93 | 1.01 0.99 1.00 1.05 1.48 | +| 0.6 | 1.19 1.53 1.49 2.71 2.49 | 1.20 1.47 1.46 1.94 2.50 | 1.34 1.03 0.98 0.92 0.90 | 1.88 1.60 1.27 0.95 1.00 | 1.01 1.04 0.99 1.05 1.44 | +| 0.7 | 1.24 1.54 1.57 2.74 2.56 | 1.24 1.52 1.56 1.90 2.54 | 1.45 1.12 0.93 0.88 0.90 | 2.01 1.80 1.34 1.11 0.99 | 0.98 1.55 0.98 0.86 1.34 | +| 0.8 | 1.28 1.63 1.68 2.15 2.58 | 1.44 1.57 1.65 2.17 2.69 | 1.44 1.52 0.94 0.93 0.88 | 1.96 2.12 1.44 1.38 1.03 | 0.97 1.02 0.95 0.76 1.18 | +| 0.9 | 1.35 1.62 1.76 2.24 2.68 | 1.46 1.55 1.73 2.21 2.78 | 1.36 1.68 1.12 0.76 0.82 | 1.68 2.15 1.44 1.19 0.96 | 0.75 0.80 0.89 0.87 0.92 | +----------------------------------------------------------------------------------------------------------------------------------------------------- +] + +[pre + ---------------------------------------------------------------------------------------------------------------------------------------- + | sizeof(element): 80 | + ---------------------------------------------------------------------------------------------------------------------------------------- + | insert, erase, insert | ins, erase, ins, destroy | range for | for_each | sort | + ---------------------------------------------------------------------------------------------------------------------------------------- + | container size | container size | container size | container size | container size | +----------------------------------------------------------------------------------------------------------------------------------------------------- +| erase rate | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | +----------------------------------------------------------------------------------------------------------------------------------------------------- +| 0 | 1.10 3.56 3.47 3.03 2.21 | 1.06 1.01 1.02 3.29 2.35 | 1.04 1.00 0.99 0.92 0.91 | 1.45 1.40 1.43 0.89 0.97 | 1.00 0.99 1.00 1.36 1.77 | +| 0.1 | 1.05 1.06 1.12 2.69 2.11 | 1.04 1.00 1.06 2.98 2.18 | 1.08 1.04 1.01 0.94 0.91 | 1.43 1.30 1.35 0.93 0.91 | 1.00 0.98 1.00 1.43 1.71 | +| 0.2 | 1.05 1.09 1.19 2.64 2.26 | 1.04 1.02 1.13 3.01 2.33 | 1.10 1.02 0.99 0.92 0.91 | 1.44 1.27 1.31 0.92 0.90 | 1.01 0.98 0.98 1.34 1.61 | +| 0.3 | 1.07 1.14 1.26 2.76 2.33 | 1.05 1.07 1.19 2.90 2.36 | 1.09 0.99 0.96 0.94 0.91 | 1.48 1.21 1.18 0.93 0.89 | 1.01 0.98 0.99 1.11 1.58 | +| 0.4 | 1.13 1.20 1.32 2.73 2.45 | 1.10 1.16 1.27 2.79 2.43 | 1.02 0.97 0.94 0.89 0.93 | 1.49 1.08 1.03 0.92 0.89 | 0.99 0.97 0.98 1.17 1.52 | +| 0.5 | 1.16 1.42 1.41 2.70 2.53 | 1.15 1.35 1.35 3.02 2.57 | 1.19 0.99 0.94 0.94 0.97 | 1.54 1.14 1.04 0.92 0.96 | 0.99 0.97 0.98 1.11 1.42 | +| 0.6 | 1.24 1.52 1.50 2.74 2.61 | 1.20 1.45 1.46 3.06 2.66 | 1.24 1.01 0.97 0.92 0.97 | 1.61 1.48 1.15 0.94 0.96 | 0.98 0.99 0.98 0.91 1.30 | +| 0.7 | 1.32 1.53 1.61 3.03 2.67 | 1.28 1.48 1.54 2.92 2.69 | 1.37 1.12 0.89 0.88 0.94 | 1.56 1.63 1.13 0.99 0.95 | 0.93 1.54 0.97 0.80 1.23 | +| 0.8 | 1.36 1.62 1.70 3.00 2.71 | 1.33 1.52 1.63 3.07 2.50 | 1.39 1.37 0.91 0.92 0.90 | 1.60 1.73 1.15 1.42 0.96 | 0.92 1.01 0.95 0.75 1.14 | +| 0.9 | 1.44 1.59 1.77 2.95 2.61 | 1.38 1.52 1.70 3.26 2.74 | 1.29 1.59 1.07 0.73 0.90 | 1.43 1.94 1.14 0.88 0.92 | 0.79 0.80 0.90 0.88 1.00 | +----------------------------------------------------------------------------------------------------------------------------------------------------- +] + + +[endsect] + +[section:hub_clang_20_x64 Clang 20, x64] + +[pre + ---------------------------------------------------------------------------------------------------------------------------------------- + | sizeof(element): 16 | + ---------------------------------------------------------------------------------------------------------------------------------------- + | insert, erase, insert | ins, erase, ins, destroy | range for | for_each | sort | + ---------------------------------------------------------------------------------------------------------------------------------------- + | container size | container size | container size | container size | container size | +----------------------------------------------------------------------------------------------------------------------------------------------------- +| erase rate | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | +----------------------------------------------------------------------------------------------------------------------------------------------------- +| 0 | 1.56 2.49 1.37 1.82 1.82 | 1.08 1.57 1.46 1.69 1.84 | 1.95 2.07 2.07 2.07 2.06 | 2.19 2.39 2.38 2.39 2.30 | 1.06 1.03 1.01 1.01 1.00 | +| 0.1 | 1.58 1.47 1.40 2.15 1.75 | 1.15 1.58 1.47 1.93 1.75 | 2.01 1.99 1.79 1.78 1.78 | 2.27 2.40 2.26 2.04 1.99 | 1.05 1.01 1.00 1.00 0.96 | +| 0.2 | 1.69 1.55 1.55 2.26 2.11 | 1.86 1.67 1.60 2.24 2.17 | 1.99 2.02 1.79 1.75 1.74 | 2.21 2.43 2.28 2.02 1.93 | 1.04 1.08 1.00 0.99 0.96 | +| 0.3 | 1.95 1.67 1.67 2.49 2.40 | 1.96 1.73 1.71 2.31 2.39 | 1.98 2.11 1.79 1.72 1.68 | 2.32 2.47 2.32 1.99 1.84 | 1.04 1.00 1.00 0.99 0.95 | +| 0.4 | 2.02 1.75 1.82 2.30 2.62 | 2.06 1.81 1.86 2.88 2.55 | 1.96 2.11 1.82 1.69 1.60 | 2.24 2.50 2.45 1.96 1.75 | 1.03 0.98 0.99 0.99 0.94 | +| 0.5 | 1.30 1.81 1.98 2.53 2.84 | 2.20 1.89 2.02 2.76 2.73 | 1.89 2.14 1.90 1.64 1.49 | 2.24 2.54 2.53 1.91 1.65 | 0.98 0.99 0.99 0.99 0.93 | +| 0.6 | 1.36 1.92 2.17 2.57 2.99 | 2.31 1.95 2.19 2.67 2.80 | 1.94 2.15 2.10 1.57 1.49 | 2.27 2.61 2.53 1.83 1.47 | 0.98 0.97 0.98 0.98 0.91 | +| 0.7 | 1.42 1.99 2.33 2.97 3.08 | 2.39 2.03 2.34 2.86 3.01 | 1.91 2.18 2.07 1.48 1.43 | 2.38 2.73 2.25 1.75 1.25 | 1.01 0.96 0.98 0.97 0.90 | +| 0.8 | 1.52 2.07 2.47 2.86 3.11 | 2.52 2.07 2.47 2.98 2.96 | 1.91 2.14 1.74 1.32 1.07 | 2.37 2.62 1.91 1.53 0.82 | 0.96 0.93 0.96 0.92 0.86 | +| 0.9 | 1.67 2.10 2.60 2.89 3.09 | 2.64 2.19 2.60 2.91 3.04 | 1.66 1.81 1.50 1.08 0.85 | 2.03 2.07 2.00 1.56 1.06 | 0.89 0.84 0.90 0.88 0.76 | +----------------------------------------------------------------------------------------------------------------------------------------------------- +] + +[pre + ---------------------------------------------------------------------------------------------------------------------------------------- + | sizeof(element): 32 | + ---------------------------------------------------------------------------------------------------------------------------------------- + | insert, erase, insert | ins, erase, ins, destroy | range for | for_each | sort | + ---------------------------------------------------------------------------------------------------------------------------------------- + | container size | container size | container size | container size | container size | +----------------------------------------------------------------------------------------------------------------------------------------------------- +| erase rate | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | +----------------------------------------------------------------------------------------------------------------------------------------------------- +| 0 | 1.70 2.56 3.82 3.18 2.19 | 1.73 1.59 1.49 3.29 2.18 | 1.99 2.07 2.06 1.88 1.77 | 2.26 2.39 2.38 2.14 2.09 | 1.10 1.02 1.03 1.62 2.38 | +| 0.1 | 1.67 1.62 1.60 2.92 2.00 | 1.74 1.62 1.54 2.87 2.06 | 1.99 1.94 1.77 1.61 1.39 | 2.32 2.40 2.26 1.89 1.85 | 1.09 0.99 1.01 1.52 2.27 | +| 0.2 | 1.75 1.56 1.78 3.16 2.35 | 1.82 1.70 1.72 3.39 2.44 | 2.02 1.99 1.76 1.58 1.31 | 2.30 2.43 2.26 1.83 1.70 | 1.10 0.95 1.01 1.45 2.17 | +| 0.3 | 1.87 1.84 1.93 3.66 2.73 | 1.90 1.78 1.86 3.78 2.66 | 1.99 2.06 1.77 1.54 1.33 | 2.37 2.46 2.23 1.77 1.63 | 1.09 1.10 1.00 1.36 2.07 | +| 0.4 | 1.94 1.93 2.07 3.60 2.83 | 1.99 1.87 1.98 3.41 2.85 | 2.00 2.09 1.76 1.51 1.42 | 2.26 2.47 2.28 1.68 1.48 | 1.08 1.09 1.01 1.28 1.96 | +| 0.5 | 2.01 1.60 2.14 3.41 3.06 | 2.02 1.95 2.10 3.38 2.98 | 1.93 2.09 1.73 1.54 1.35 | 2.33 2.53 2.08 1.45 1.24 | 1.08 1.01 1.00 1.21 1.91 | +| 0.6 | 2.11 1.61 2.31 3.42 3.02 | 2.10 1.99 2.25 3.36 3.07 | 2.00 2.10 1.70 1.30 1.12 | 2.36 2.55 1.85 1.31 1.00 | 1.08 1.05 1.00 1.13 1.81 | +| 0.7 | 2.16 1.59 2.53 4.00 3.16 | 2.17 2.07 2.42 3.34 3.14 | 2.07 2.05 1.49 0.98 0.98 | 2.50 2.51 1.68 1.55 0.92 | 1.07 1.03 0.99 1.06 1.75 | +| 0.8 | 2.26 2.23 2.67 3.45 3.06 | 2.26 2.13 2.59 3.33 3.14 | 1.86 2.01 1.43 1.34 0.99 | 2.32 2.39 1.64 1.61 1.16 | 1.01 1.01 0.98 1.01 1.57 | +| 0.9 | 2.31 1.99 2.77 3.39 3.20 | 2.28 2.21 2.67 3.30 3.15 | 1.55 1.99 1.63 1.05 0.93 | 2.16 2.30 2.08 1.59 1.15 | 0.82 0.89 0.92 0.87 1.25 | +----------------------------------------------------------------------------------------------------------------------------------------------------- +] + +[pre + ---------------------------------------------------------------------------------------------------------------------------------------- + | sizeof(element): 64 | + ---------------------------------------------------------------------------------------------------------------------------------------- + | insert, erase, insert | ins, erase, ins, destroy | range for | for_each | sort | + ---------------------------------------------------------------------------------------------------------------------------------------- + | container size | container size | container size | container size | container size | +----------------------------------------------------------------------------------------------------------------------------------------------------- +| erase rate | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | +----------------------------------------------------------------------------------------------------------------------------------------------------- +| 0 | 2.12 5.72 5.51 4.35 3.02 | 1.91 1.49 1.69 1.72 2.69 | 1.98 2.03 1.96 1.20 1.02 | 2.22 2.31 2.03 0.97 0.91 | 1.01 1.01 1.01 2.05 2.32 | +| 0.1 | 2.12 2.14 1.98 3.60 2.47 | 1.95 1.53 1.79 2.29 2.39 | 2.01 1.91 1.74 1.06 1.00 | 2.28 2.31 1.89 1.02 1.00 | 1.00 0.99 1.01 1.82 2.15 | +| 0.2 | 2.28 2.13 2.18 3.83 2.96 | 2.01 1.59 1.95 2.63 2.76 | 1.99 1.98 1.69 0.95 1.01 | 2.28 2.42 1.83 1.01 0.96 | 0.99 1.00 1.00 1.49 2.05 | +| 0.3 | 2.35 2.27 2.29 3.97 2.99 | 2.07 1.84 2.06 2.84 2.90 | 1.96 1.87 1.62 0.94 0.96 | 2.23 2.25 1.70 0.80 0.92 | 1.01 1.39 0.99 1.47 1.95 | +| 0.4 | 2.43 2.22 2.43 3.11 2.93 | 2.17 1.92 2.17 2.90 2.91 | 1.91 1.87 1.52 0.93 0.93 | 2.17 2.36 1.56 0.85 0.85 | 1.01 1.00 0.99 1.34 1.85 | +| 0.5 | 2.49 2.25 2.54 3.19 3.09 | 2.25 2.06 2.28 2.72 2.64 | 1.86 2.01 1.38 0.97 0.92 | 2.18 2.33 1.49 1.00 0.93 | 0.99 1.00 0.99 1.24 1.80 | +| 0.6 | 2.56 2.43 2.72 2.97 2.98 | 2.33 2.15 2.41 2.69 2.74 | 1.91 2.01 1.35 0.94 0.98 | 2.30 2.34 1.47 1.15 1.05 | 0.98 1.00 0.99 1.16 1.64 | +| 0.7 | 2.63 2.60 2.94 2.99 2.89 | 2.40 2.22 2.58 2.65 2.66 | 1.93 2.02 1.38 1.00 1.01 | 2.36 2.34 1.50 1.42 1.07 | 0.98 0.99 0.98 1.22 1.63 | +| 0.8 | 2.69 2.11 2.92 2.85 2.92 | 2.48 2.31 2.74 2.62 2.60 | 1.93 2.17 1.52 1.04 1.01 | 2.35 2.46 1.69 1.54 1.07 | 0.94 0.96 0.96 0.93 1.43 | +| 0.9 | 2.78 2.09 3.01 2.75 2.81 | 2.52 2.37 2.78 2.71 2.60 | 1.69 2.00 1.70 1.19 0.89 | 2.00 2.46 2.10 1.59 1.01 | 0.82 0.89 0.91 0.87 1.35 | +----------------------------------------------------------------------------------------------------------------------------------------------------- +] + +[pre + ---------------------------------------------------------------------------------------------------------------------------------------- + | sizeof(element): 80 | + ---------------------------------------------------------------------------------------------------------------------------------------- + | insert, erase, insert | ins, erase, ins, destroy | range for | for_each | sort | + ---------------------------------------------------------------------------------------------------------------------------------------- + | container size | container size | container size | container size | container size | +----------------------------------------------------------------------------------------------------------------------------------------------------- +| erase rate | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | +----------------------------------------------------------------------------------------------------------------------------------------------------- +| 0 | 2.15 6.48 6.08 4.09 3.06 | 2.16 1.32 1.73 4.10 3.09 | 1.71 1.71 1.64 1.05 0.98 | 1.72 1.68 1.56 0.76 0.70 | 1.05 1.00 1.00 1.77 2.18 | +| 0.1 | 2.19 2.10 1.97 3.44 2.42 | 2.14 1.56 1.78 3.28 2.74 | 1.76 1.74 1.53 1.04 0.98 | 1.80 1.74 1.45 0.87 0.90 | 1.03 1.01 1.01 1.58 2.10 | +| 0.2 | 2.22 2.14 2.10 4.28 2.87 | 1.97 1.66 1.92 3.95 2.99 | 1.79 1.75 1.48 0.98 0.96 | 1.81 1.81 1.38 0.82 0.91 | 1.05 1.01 0.99 1.41 1.94 | +| 0.3 | 2.28 2.17 2.25 4.17 3.23 | 2.26 1.66 2.03 4.13 2.90 | 1.79 1.81 1.35 0.92 0.90 | 1.79 1.84 1.30 0.76 0.85 | 1.04 1.29 0.99 1.31 1.84 | +| 0.4 | 2.41 2.39 2.23 4.17 3.24 | 2.32 1.95 2.11 3.87 3.07 | 1.75 1.79 1.20 0.96 0.95 | 1.80 1.75 1.30 0.98 0.97 | 1.05 1.03 1.00 1.26 1.67 | +| 0.5 | 2.51 1.86 2.43 3.96 3.12 | 2.40 1.87 2.24 3.57 3.02 | 1.71 1.85 1.19 1.03 1.04 | 1.79 1.90 1.30 1.18 1.10 | 1.03 1.04 0.99 1.19 1.63 | +| 0.6 | 2.52 2.59 2.62 3.69 3.02 | 2.27 2.03 2.38 3.71 2.96 | 1.78 1.83 1.25 1.00 1.04 | 1.89 1.87 1.34 1.26 1.13 | 1.06 1.03 0.98 1.17 1.57 | +| 0.7 | 2.56 2.64 2.77 3.50 2.93 | 2.50 2.01 2.50 3.56 2.92 | 1.65 1.80 1.35 1.03 1.03 | 1.88 1.99 1.46 1.40 1.10 | 1.05 1.01 0.98 0.99 1.54 | +| 0.8 | 2.67 2.19 2.99 3.45 2.99 | 2.41 2.10 2.65 3.31 2.83 | 1.61 1.89 1.55 1.73 1.03 | 1.89 2.17 1.73 0.87 1.14 | 1.03 0.98 0.96 0.96 1.29 | +| 0.9 | 2.74 2.30 3.12 3.42 2.72 | 2.58 2.16 2.75 3.41 2.69 | 1.48 1.82 1.54 1.08 0.98 | 1.76 2.15 1.95 1.65 1.10 | 0.86 0.91 0.92 0.82 1.06 | +----------------------------------------------------------------------------------------------------------------------------------------------------- +] + + +[endsect] + +[section:hub_clang_17_arm64 Clang 17, ARM64] + +[pre + ---------------------------------------------------------------------------------------------------------------------------------------- + | sizeof(element): 16 | + ---------------------------------------------------------------------------------------------------------------------------------------- + | insert, erase, insert | ins, erase, ins, destroy | range for | for_each | sort | + ---------------------------------------------------------------------------------------------------------------------------------------- + | container size | container size | container size | container size | container size | +----------------------------------------------------------------------------------------------------------------------------------------------------- +| erase rate | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | +----------------------------------------------------------------------------------------------------------------------------------------------------- +| 0 | 1.05 1.25 1.23 1.25 1.40 | 1.39 2.19 1.39 1.33 1.21 | 1.79 1.92 1.88 1.88 1.92 | 2.20 2.39 2.37 2.37 2.40 | 1.01 1.45 1.18 1.01 1.01 | +| 0.1 | 1.32 0.95 1.37 1.36 1.19 | 1.40 1.86 1.42 1.48 1.34 | 1.48 1.48 1.40 1.44 1.43 | 2.19 2.31 2.26 2.31 2.32 | 0.97 1.50 1.04 0.98 0.95 | +| 0.2 | 1.25 1.49 1.43 1.70 1.42 | 1.41 2.08 1.47 1.43 1.54 | 1.52 1.42 1.37 1.35 1.42 | 2.17 2.31 2.24 2.27 2.33 | 0.97 0.85 0.99 0.97 0.93 | +| 0.3 | 1.58 1.57 1.19 1.55 1.87 | 1.42 2.58 1.56 1.56 1.48 | 1.74 1.44 1.39 1.37 1.42 | 2.51 2.35 2.26 2.25 2.31 | 0.98 0.70 1.11 0.97 0.93 | +| 0.4 | 1.07 1.59 1.43 1.82 1.42 | 1.46 2.09 1.86 1.67 1.63 | 1.74 1.44 1.35 1.37 1.39 | 2.50 2.32 2.21 2.26 2.27 | 0.96 0.74 1.09 0.96 0.92 | +| 0.5 | 1.28 1.92 1.67 1.70 1.50 | 1.48 2.32 1.70 1.75 1.67 | 2.16 1.65 1.34 1.35 1.37 | 3.05 2.63 2.21 2.16 2.27 | 0.96 0.77 1.10 0.99 0.91 | +| 0.6 | 1.48 1.95 1.62 1.70 1.63 | 1.51 2.41 1.78 1.74 1.66 | 2.24 1.76 1.33 1.29 1.35 | 3.07 2.94 2.29 2.09 2.20 | 0.96 0.64 1.17 0.98 0.90 | +| 0.7 | 1.43 1.84 1.69 1.76 1.70 | 1.52 1.85 1.86 1.77 1.65 | 2.26 2.75 1.43 1.24 1.29 | 2.96 3.78 2.40 1.94 1.97 | 0.93 0.41 0.95 0.98 0.87 | +| 0.8 | 1.46 1.90 1.72 1.75 1.68 | 1.61 1.99 1.86 1.79 1.69 | 2.32 2.65 1.88 1.17 1.23 | 2.71 3.18 2.64 1.50 1.45 | 0.86 2.21 0.99 0.98 0.81 | +| 0.9 | 1.50 1.95 1.75 1.77 1.56 | 1.60 3.03 1.91 1.77 1.72 | 1.77 3.59 1.61 1.16 1.21 | 1.79 4.59 1.78 1.24 1.22 | 0.74 1.45 1.49 0.95 0.75 | +----------------------------------------------------------------------------------------------------------------------------------------------------- +] + +[pre + ---------------------------------------------------------------------------------------------------------------------------------------- + | sizeof(element): 32 | + ---------------------------------------------------------------------------------------------------------------------------------------- + | insert, erase, insert | ins, erase, ins, destroy | range for | for_each | sort | + ---------------------------------------------------------------------------------------------------------------------------------------- + | container size | container size | container size | container size | container size | +----------------------------------------------------------------------------------------------------------------------------------------------------- +| erase rate | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | +----------------------------------------------------------------------------------------------------------------------------------------------------- +| 0 | 1.28 1.14 1.25 1.23 1.18 | 1.43 2.56 1.74 1.32 1.20 | 1.75 1.91 1.83 1.78 1.93 | 2.50 2.79 2.87 2.77 2.79 | 1.10 1.07 1.14 1.99 2.70 | +| 0.1 | 1.31 1.52 1.33 1.63 1.37 | 1.47 2.42 1.65 1.51 1.52 | 1.46 1.51 1.46 1.33 1.38 | 2.06 2.31 2.31 2.32 2.30 | 1.05 1.04 1.08 1.84 2.32 | +| 0.2 | 1.34 1.68 1.46 1.73 1.57 | 1.47 1.78 1.48 1.93 1.70 | 1.51 1.44 1.42 1.36 1.37 | 2.30 2.25 2.29 2.02 1.89 | 1.05 0.91 1.14 2.19 2.69 | +| 0.3 | 1.39 1.86 1.54 1.77 1.64 | 1.46 3.53 1.83 1.91 1.65 | 1.82 1.44 1.39 1.42 1.39 | 2.54 2.42 2.36 1.96 1.96 | 1.05 1.12 0.97 2.14 2.94 | +| 0.4 | 1.44 1.99 1.61 1.77 1.66 | 1.55 3.19 1.86 1.84 1.72 | 1.77 1.46 1.33 1.35 1.39 | 2.73 2.38 2.33 1.85 1.74 | 1.07 0.88 0.98 1.91 2.56 | +| 0.5 | 1.48 2.03 1.67 1.71 1.66 | 1.61 2.39 2.00 1.71 1.63 | 2.12 1.70 1.27 1.30 1.42 | 2.88 2.83 2.29 1.70 1.52 | 1.04 1.01 1.13 1.56 2.35 | +| 0.6 | 1.53 2.12 1.70 1.71 1.67 | 1.47 3.24 1.97 1.72 1.64 | 2.43 1.70 1.35 1.27 1.30 | 3.14 2.99 2.39 1.41 1.40 | 1.02 1.08 1.05 1.40 2.21 | +| 0.7 | 1.55 2.14 1.77 1.69 1.59 | 1.63 3.30 1.91 1.79 1.77 | 1.99 2.26 1.37 1.04 1.33 | 2.94 2.91 2.52 1.15 1.14 | 0.97 0.72 1.21 1.24 2.04 | +| 0.8 | 1.61 2.07 1.83 1.63 1.61 | 1.78 3.44 1.86 1.77 1.71 | 2.44 1.84 1.81 1.25 1.24 | 2.74 2.59 2.27 1.13 1.13 | 0.93 2.56 1.08 1.14 1.82 | +| 0.9 | 1.66 1.98 1.85 1.66 1.47 | 1.69 3.56 1.91 1.80 1.64 | 1.72 3.82 2.23 1.17 1.16 | 1.89 4.62 2.42 1.37 1.30 | 0.77 2.47 0.92 0.88 1.37 | +----------------------------------------------------------------------------------------------------------------------------------------------------- +] + +[pre + ---------------------------------------------------------------------------------------------------------------------------------------- + | sizeof(element): 64 | + ---------------------------------------------------------------------------------------------------------------------------------------- + | insert, erase, insert | ins, erase, ins, destroy | range for | for_each | sort | + ---------------------------------------------------------------------------------------------------------------------------------------- + | container size | container size | container size | container size | container size | +----------------------------------------------------------------------------------------------------------------------------------------------------- +| erase rate | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | +----------------------------------------------------------------------------------------------------------------------------------------------------- +| 0 | 1.52 1.37 1.50 1.36 1.15 | 1.51 1.47 1.66 1.33 1.23 | 1.81 1.94 1.83 1.69 1.73 | 2.20 2.41 2.25 1.54 1.77 | 1.02 0.95 1.14 1.92 2.62 | +| 0.1 | 1.57 1.46 1.52 1.61 1.44 | 1.56 1.39 1.75 1.70 1.47 | 1.49 1.42 1.44 1.42 1.41 | 2.17 2.38 2.23 1.50 1.49 | 1.01 0.96 1.10 1.83 2.55 | +| 0.2 | 1.62 1.69 1.49 1.86 1.61 | 1.58 1.61 1.66 1.83 1.57 | 1.52 1.41 1.40 1.34 1.34 | 2.20 2.41 2.18 1.34 1.31 | 1.04 0.94 1.06 1.89 2.47 | +| 0.3 | 1.66 1.93 1.63 1.87 1.66 | 1.61 1.79 1.77 1.75 1.67 | 1.68 1.42 1.34 1.23 1.30 | 2.47 2.45 2.29 1.17 1.18 | 1.03 0.94 1.03 1.64 2.37 | +| 0.4 | 1.72 2.02 1.77 1.84 1.68 | 1.68 1.89 1.83 1.81 1.68 | 1.77 1.46 1.33 1.09 1.13 | 2.54 2.48 2.15 1.08 1.07 | 1.03 0.93 1.05 1.53 2.33 | +| 0.5 | 1.77 2.09 1.81 1.82 1.64 | 1.72 1.91 1.91 1.76 1.74 | 2.17 1.68 1.33 1.04 1.10 | 3.04 2.63 2.18 1.03 0.99 | 1.02 0.91 1.05 1.44 2.15 | +| 0.6 | 1.82 2.07 1.90 1.77 1.64 | 1.76 2.01 1.91 1.70 1.66 | 2.27 1.75 1.35 1.01 1.05 | 3.16 2.61 2.20 1.04 1.01 | 1.01 0.88 1.16 1.28 1.98 | +| 0.7 | 1.84 2.12 2.01 1.73 1.62 | 1.81 1.97 1.88 1.73 1.64 | 2.30 2.18 1.45 1.01 1.11 | 2.97 2.66 2.08 1.01 1.00 | 0.99 0.42 1.10 1.22 1.76 | +| 0.8 | 1.88 2.10 2.03 1.67 1.58 | 1.86 2.02 2.03 1.56 1.60 | 2.35 2.36 1.77 1.04 1.07 | 2.76 2.72 2.32 1.21 1.14 | 0.94 0.72 1.04 1.02 1.55 | +| 0.9 | 1.90 2.07 2.05 1.62 1.59 | 1.87 1.96 2.01 1.51 1.56 | 1.70 3.50 2.24 1.21 1.06 | 1.99 4.66 2.57 1.56 1.17 | 0.80 0.84 1.03 0.86 1.21 | +----------------------------------------------------------------------------------------------------------------------------------------------------- +] + +[pre + ---------------------------------------------------------------------------------------------------------------------------------------- + | sizeof(element): 80 | + ---------------------------------------------------------------------------------------------------------------------------------------- + | insert, erase, insert | ins, erase, ins, destroy | range for | for_each | sort | + ---------------------------------------------------------------------------------------------------------------------------------------- + | container size | container size | container size | container size | container size | +----------------------------------------------------------------------------------------------------------------------------------------------------- +| erase rate | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | +----------------------------------------------------------------------------------------------------------------------------------------------------- +| 0 | 1.55 1.36 1.60 1.32 1.20 | 1.47 1.43 1.60 1.28 1.19 | 1.80 1.80 1.59 1.27 1.17 | 2.40 2.75 2.32 1.20 1.37 | 1.00 1.01 1.05 1.90 2.61 | +| 0.1 | 1.60 1.41 1.61 1.56 1.36 | 1.51 1.35 1.72 1.46 1.39 | 1.37 1.34 1.45 1.09 1.03 | 2.06 2.39 1.50 1.11 1.20 | 1.00 1.03 0.95 1.63 3.19 | +| 0.2 | 1.66 1.50 1.73 1.71 1.44 | 1.55 1.50 1.76 1.56 1.45 | 1.44 1.31 1.24 1.02 0.98 | 2.30 2.52 1.84 1.16 1.08 | 0.95 0.92 1.35 1.60 2.49 | +| 0.3 | 1.70 1.56 1.84 1.69 1.49 | 1.60 1.53 1.81 1.66 1.52 | 1.58 1.33 1.36 1.13 0.90 | 2.43 2.43 1.97 1.06 1.00 | 0.99 1.17 0.96 1.65 2.24 | +| 0.4 | 1.79 1.67 1.86 1.77 1.57 | 1.66 1.72 1.89 1.71 1.52 | 1.52 1.37 1.11 0.93 0.83 | 2.58 2.45 1.90 1.02 1.16 | 0.98 0.97 1.19 1.64 2.17 | +| 0.5 | 1.83 1.83 1.95 1.70 1.60 | 1.72 1.70 2.02 1.60 1.36 | 2.02 1.54 1.18 1.13 0.99 | 2.93 2.55 1.86 1.05 1.06 | 1.02 0.97 0.99 1.51 2.03 | +| 0.6 | 1.89 1.87 2.04 1.66 1.57 | 1.70 1.83 2.08 1.50 1.59 | 2.15 1.68 1.17 0.96 0.98 | 3.00 2.67 2.18 1.05 1.14 | 0.99 0.94 0.99 1.35 1.80 | +| 0.7 | 1.92 1.95 2.10 1.55 1.58 | 1.61 2.15 3.12 1.44 1.63 | 2.10 2.00 1.26 0.96 0.94 | 2.85 2.43 2.23 1.14 1.21 | 0.99 0.93 1.05 1.24 1.70 | +| 0.8 | 1.94 2.08 2.19 1.51 1.54 | 1.63 2.32 2.35 1.29 1.53 | 2.31 2.88 1.89 0.99 1.02 | 2.67 3.08 2.61 1.33 1.30 | 0.92 1.03 0.82 0.97 1.48 | +| 0.9 | 1.96 2.15 2.05 1.69 1.56 | 1.62 2.14 1.51 1.74 1.53 | 1.77 3.17 2.29 0.99 0.98 | 1.86 4.40 2.63 1.51 1.18 | 0.79 3.16 0.65 0.86 1.04 | +----------------------------------------------------------------------------------------------------------------------------------------------------- +] + + +[endsect] + +[section:hub_vs_2022_x64 VS 2022, x64] + +[pre + ---------------------------------------------------------------------------------------------------------------------------------------- + | sizeof(element): 16 | + ---------------------------------------------------------------------------------------------------------------------------------------- + | insert, erase, insert | ins, erase, ins, destroy | range for | for_each | sort | + ---------------------------------------------------------------------------------------------------------------------------------------- + | container size | container size | container size | container size | container size | +----------------------------------------------------------------------------------------------------------------------------------------------------- +| erase rate | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | +----------------------------------------------------------------------------------------------------------------------------------------------------- +| 0 | 0.84 1.00 1.05 1.04 1.10 | 0.91 0.90 1.00 0.94 1.04 | 1.59 1.63 1.65 1.58 1.19 | 1.16 1.12 1.32 1.23 1.18 | 1.04 1.01 1.01 0.98 0.98 | +| 0.1 | 0.86 0.86 1.00 1.20 1.17 | 0.93 0.92 1.05 1.10 1.12 | 1.41 1.42 1.39 1.36 1.09 | 1.17 1.16 1.20 1.27 1.13 | 1.05 1.00 1.00 0.97 0.96 | +| 0.2 | 0.89 0.93 1.05 1.23 1.21 | 0.96 1.00 1.09 1.19 1.22 | 1.35 1.39 1.41 1.37 1.06 | 1.15 1.17 1.24 1.28 1.13 | 1.07 1.01 1.00 0.95 0.95 | +| 0.3 | 0.91 1.06 1.13 1.32 1.36 | 0.99 1.11 1.17 1.23 1.33 | 1.35 1.41 1.38 1.35 1.01 | 1.17 1.15 1.28 1.30 1.10 | 1.03 1.01 0.98 0.96 0.94 | +| 0.4 | 0.96 1.11 1.19 1.41 1.39 | 1.02 1.20 1.25 1.34 1.35 | 1.35 1.38 1.37 1.30 0.96 | 1.16 1.15 1.33 1.33 1.05 | 1.03 1.00 0.99 0.95 0.93 | +| 0.5 | 1.01 1.23 1.26 1.41 1.46 | 1.08 1.29 1.29 1.45 1.44 | 1.52 1.37 1.33 1.29 0.97 | 1.17 1.18 1.34 1.36 1.04 | 1.03 1.00 0.98 0.95 0.93 | +| 0.6 | 1.04 1.32 1.31 1.49 1.50 | 1.09 1.37 1.35 1.48 1.48 | 1.54 1.36 1.29 1.26 0.97 | 1.13 1.20 1.35 1.34 1.06 | 1.03 0.99 0.98 0.92 0.92 | +| 0.7 | 1.10 1.38 1.37 1.50 1.51 | 1.12 1.44 1.40 1.54 1.55 | 1.84 1.62 1.30 1.18 1.06 | 1.10 1.24 1.31 1.31 1.09 | 0.95 1.01 0.97 0.94 0.91 | +| 0.8 | 1.12 1.42 1.38 1.60 1.58 | 1.16 1.47 1.46 1.64 1.55 | 1.83 2.23 1.40 1.09 1.09 | 1.07 1.31 1.52 1.32 1.16 | 0.90 1.01 0.97 0.90 0.89 | +| 0.9 | 1.15 1.43 1.41 1.58 1.61 | 1.21 1.49 1.47 1.64 1.57 | 1.65 2.88 1.39 1.13 1.14 | 0.92 1.51 1.55 1.28 1.18 | 0.80 1.04 0.95 0.87 0.84 | +----------------------------------------------------------------------------------------------------------------------------------------------------- +] + +[pre + ---------------------------------------------------------------------------------------------------------------------------------------- + | sizeof(element): 32 | + ---------------------------------------------------------------------------------------------------------------------------------------- + | insert, erase, insert | ins, erase, ins, destroy | range for | for_each | sort | + ---------------------------------------------------------------------------------------------------------------------------------------- + | container size | container size | container size | container size | container size | +----------------------------------------------------------------------------------------------------------------------------------------------------- +| erase rate | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | +----------------------------------------------------------------------------------------------------------------------------------------------------- +| 0 | 0.87 0.83 1.06 0.98 1.07 | 0.95 0.91 0.99 0.92 1.00 | 1.59 1.62 1.57 1.26 1.01 | 1.14 1.12 1.28 1.18 1.06 | 1.08 1.04 1.01 1.70 2.17 | +| 0.1 | 0.89 0.87 1.02 1.13 1.21 | 0.96 0.92 1.05 1.11 1.15 | 1.36 1.35 1.33 1.07 0.97 | 1.16 1.19 1.34 1.20 1.05 | 1.04 1.03 0.99 1.67 2.08 | +| 0.2 | 0.92 0.90 1.09 1.29 1.28 | 1.00 0.96 1.11 1.25 1.25 | 1.28 1.31 1.25 0.99 0.96 | 1.14 1.21 1.29 1.21 1.03 | 1.01 1.02 1.00 1.67 2.09 | +| 0.3 | 0.97 0.94 1.16 1.35 1.34 | 1.01 1.00 1.17 1.29 1.36 | 1.30 1.29 1.16 0.95 0.97 | 1.16 1.20 1.35 1.11 1.04 | 1.04 1.04 1.01 1.60 2.07 | +| 0.4 | 0.99 1.03 1.23 1.44 1.42 | 1.06 1.08 1.23 1.41 1.41 | 1.26 1.28 1.25 1.10 1.00 | 1.16 1.21 1.34 1.16 1.05 | 1.02 1.03 1.00 1.53 2.02 | +| 0.5 | 1.04 1.13 1.29 1.48 1.46 | 1.09 1.17 1.28 1.53 1.47 | 1.48 1.28 1.17 1.20 1.00 | 1.16 1.23 1.28 1.16 1.07 | 1.04 1.03 0.99 1.48 1.97 | +| 0.6 | 1.09 1.24 1.34 1.58 1.52 | 1.18 1.27 1.35 1.49 1.49 | 1.49 1.25 1.12 1.20 1.05 | 1.12 1.25 1.17 1.32 1.13 | 1.03 1.03 0.97 1.48 1.93 | +| 0.7 | 1.10 1.31 1.41 1.56 1.55 | 1.18 1.36 1.41 1.59 1.54 | 1.84 1.53 1.25 1.13 1.09 | 1.12 1.28 1.27 1.38 1.16 | 1.02 1.03 0.99 1.38 1.88 | +| 0.8 | 1.18 1.37 1.44 1.65 1.55 | 1.25 1.40 1.42 1.59 1.55 | 1.71 2.11 1.27 1.12 1.08 | 1.04 1.33 1.60 1.35 1.19 | 0.95 1.09 0.99 1.28 1.74 | +| 0.9 | 1.22 1.39 1.40 1.68 1.60 | 1.28 1.42 1.42 1.67 1.55 | 1.51 2.57 1.58 1.18 1.04 | 0.94 1.53 1.55 1.31 1.13 | 0.91 1.57 0.97 0.90 1.49 | +----------------------------------------------------------------------------------------------------------------------------------------------------- +] + +[pre + ---------------------------------------------------------------------------------------------------------------------------------------- + | sizeof(element): 64 | + ---------------------------------------------------------------------------------------------------------------------------------------- + | insert, erase, insert | ins, erase, ins, destroy | range for | for_each | sort | + ---------------------------------------------------------------------------------------------------------------------------------------- + | container size | container size | container size | container size | container size | +----------------------------------------------------------------------------------------------------------------------------------------------------- +| erase rate | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | +----------------------------------------------------------------------------------------------------------------------------------------------------- +| 0 | 0.91 0.85 1.13 0.96 0.90 | 0.96 0.96 1.03 1.01 0.97 | 1.61 1.63 1.19 0.90 0.93 | 1.22 1.24 1.17 0.92 0.96 | 1.01 1.05 1.03 1.59 1.99 | +| 0.1 | 0.92 0.91 1.07 1.23 1.10 | 1.00 0.98 1.10 1.14 1.12 | 1.43 1.44 1.14 0.92 0.97 | 1.23 1.25 1.03 0.96 0.96 | 0.99 1.04 1.03 1.59 1.93 | +| 0.2 | 0.94 0.97 1.18 1.39 1.29 | 1.00 1.03 1.13 1.21 1.24 | 1.40 1.42 1.10 1.00 0.98 | 1.22 1.32 1.11 1.00 0.97 | 1.01 1.03 1.04 1.51 1.90 | +| 0.3 | 0.98 1.02 1.22 1.53 1.38 | 1.04 1.07 1.25 1.46 1.29 | 1.41 1.42 0.92 0.99 0.98 | 1.23 1.27 1.19 0.99 1.03 | 1.00 1.04 1.01 1.45 1.87 | +| 0.4 | 1.02 1.08 1.32 1.67 1.47 | 1.07 1.13 1.32 1.58 1.38 | 1.39 1.42 0.96 1.00 0.99 | 1.25 1.26 1.09 1.04 1.05 | 1.02 1.06 1.01 1.45 1.78 | +| 0.5 | 1.04 1.17 1.38 1.83 1.53 | 1.08 1.21 1.40 1.65 0.93 | 1.56 1.40 1.02 1.01 0.99 | 1.15 1.27 1.17 1.11 1.06 | 0.99 1.05 1.01 1.44 1.77 | +| 0.6 | 1.08 1.26 1.46 1.91 1.70 | 0.88 1.51 1.18 1.82 1.50 | 1.59 1.38 1.06 1.10 1.00 | 1.14 1.27 1.14 1.08 1.17 | 1.00 1.07 1.05 1.32 1.69 | +| 0.7 | 1.13 1.34 1.56 2.00 1.73 | 1.15 1.35 1.48 1.85 1.62 | 1.84 1.65 1.13 0.93 1.08 | 1.11 1.31 1.22 1.42 1.17 | 1.00 1.08 1.04 1.24 1.68 | +| 0.8 | 1.14 1.36 1.48 1.87 1.72 | 1.16 1.37 1.49 1.76 1.59 | 1.81 2.21 1.27 1.11 1.04 | 1.03 1.35 1.32 1.44 1.13 | 0.99 1.10 1.02 1.17 1.53 | +| 0.9 | 1.16 1.37 1.46 1.76 1.65 | 1.19 1.41 1.50 1.69 1.52 | 1.73 2.84 1.39 1.09 1.07 | 0.94 1.52 1.66 1.23 1.18 | 0.93 1.31 1.04 0.96 1.34 | +----------------------------------------------------------------------------------------------------------------------------------------------------- +] + +[pre + ---------------------------------------------------------------------------------------------------------------------------------------- + | sizeof(element): 80 | + ---------------------------------------------------------------------------------------------------------------------------------------- + | insert, erase, insert | ins, erase, ins, destroy | range for | for_each | sort | + ---------------------------------------------------------------------------------------------------------------------------------------- + | container size | container size | container size | container size | container size | +----------------------------------------------------------------------------------------------------------------------------------------------------- +| erase rate | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | +----------------------------------------------------------------------------------------------------------------------------------------------------- +| 0 | 0.98 0.88 1.19 1.03 0.86 | 0.98 1.10 1.22 1.02 0.90 | 1.61 1.62 0.98 1.02 1.00 | 1.30 1.27 1.16 0.91 0.99 | 1.06 1.07 1.04 1.54 1.86 | +| 0.1 | 0.99 0.99 1.15 1.25 0.99 | 1.03 1.13 1.18 1.17 0.95 | 1.42 1.42 1.15 0.91 0.97 | 1.31 1.28 1.10 0.97 0.98 | 1.06 1.06 1.04 1.46 1.80 | +| 0.2 | 1.01 1.07 1.19 1.40 1.13 | 1.04 1.21 1.31 1.30 1.21 | 1.41 1.40 1.28 0.91 0.94 | 1.29 1.29 1.08 1.01 1.00 | 1.06 1.06 1.03 1.39 1.80 | +| 0.3 | 1.05 1.17 1.29 1.52 1.28 | 1.06 1.25 1.32 1.38 1.12 | 1.39 1.38 1.10 0.92 0.96 | 1.30 1.29 1.13 0.99 1.05 | 1.05 1.09 1.01 1.37 1.78 | +| 0.4 | 1.08 1.22 1.35 1.68 1.30 | 1.12 1.30 1.40 1.49 1.20 | 1.37 1.37 1.15 0.93 0.96 | 1.26 1.29 1.04 1.09 1.05 | 1.04 1.10 1.02 1.35 1.69 | +| 0.5 | 1.12 1.28 1.48 1.80 1.40 | 1.13 1.37 1.51 1.60 1.43 | 1.50 1.36 1.20 0.96 1.00 | 1.25 1.30 1.30 1.06 1.12 | 1.03 1.10 1.02 1.29 1.64 | +| 0.6 | 1.12 1.38 1.67 1.87 1.53 | 1.14 1.42 1.68 1.74 1.42 | 1.55 1.35 1.20 1.00 1.01 | 1.23 1.31 1.00 1.09 1.08 | 1.05 1.12 1.02 1.30 1.56 | +| 0.7 | 1.16 1.39 1.55 1.90 1.63 | 1.17 1.45 1.63 1.76 1.45 | 1.83 1.58 1.02 0.93 0.99 | 1.23 1.34 1.24 1.22 1.08 | 1.06 1.18 1.03 1.23 1.56 | +| 0.8 | 1.18 1.42 1.72 1.82 1.55 | 1.20 1.46 1.51 1.72 1.43 | 1.81 2.12 1.12 1.08 1.09 | 1.04 1.37 1.35 1.26 1.13 | 1.06 1.30 1.12 1.14 1.35 | +| 0.9 | 1.19 1.41 1.54 1.70 1.47 | 1.22 1.45 1.50 1.57 1.35 | 1.67 2.77 1.39 1.11 1.06 | 1.00 1.57 1.76 1.26 1.18 | 0.98 2.14 1.24 0.98 1.17 | +----------------------------------------------------------------------------------------------------------------------------------------------------- +] + + +[endsect] + +[section:hub_gcc_15_x86 GCC 15, x86] + +[pre + ---------------------------------------------------------------------------------------------------------------------------------------- + | sizeof(element): 16 | + ---------------------------------------------------------------------------------------------------------------------------------------- + | insert, erase, insert | ins, erase, ins, destroy | range for | for_each | sort | + ---------------------------------------------------------------------------------------------------------------------------------------- + | container size | container size | container size | container size | container size | +----------------------------------------------------------------------------------------------------------------------------------------------------- +| erase rate | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | +----------------------------------------------------------------------------------------------------------------------------------------------------- +| 0 | 1.07 1.27 1.36 1.28 1.32 | 1.05 1.01 1.01 1.03 1.28 | 0.73 0.75 0.71 0.74 0.72 | 1.36 1.52 1.51 1.52 1.49 | 0.97 1.00 1.00 1.02 2.00 | +| 0.1 | 1.07 1.04 1.12 1.35 1.41 | 1.06 1.02 1.03 1.11 1.44 | 0.74 0.70 0.65 0.66 0.65 | 1.36 1.50 1.45 1.31 1.30 | 0.95 0.99 0.99 1.51 1.86 | +| 0.2 | 1.07 1.05 1.14 1.57 1.51 | 1.06 1.02 1.07 1.20 1.54 | 0.74 0.71 0.64 0.64 0.62 | 1.36 1.50 1.47 1.26 1.24 | 0.96 0.99 0.99 1.00 1.83 | +| 0.3 | 1.07 1.06 1.19 1.47 1.65 | 1.05 1.02 1.11 1.27 1.65 | 0.72 0.71 0.70 0.62 0.62 | 1.33 1.50 1.48 1.22 1.18 | 0.95 1.07 0.99 0.94 1.77 | +| 0.4 | 1.08 1.07 1.22 1.50 1.62 | 1.06 1.03 1.14 1.30 1.68 | 0.70 0.72 0.71 0.61 0.62 | 1.33 1.61 1.49 1.18 1.14 | 0.94 1.13 0.99 1.06 1.77 | +| 0.5 | 1.08 1.08 1.25 1.53 1.82 | 1.06 1.04 1.16 1.35 1.74 | 0.69 0.74 0.73 0.59 0.61 | 1.28 1.58 1.48 1.14 1.09 | 0.94 0.95 0.98 0.92 1.66 | +| 0.6 | 1.09 1.04 1.22 1.34 1.95 | 1.07 1.09 1.19 1.39 1.78 | 0.70 0.76 0.74 0.56 0.63 | 1.27 1.55 1.50 1.08 1.03 | 0.92 0.91 0.97 0.86 1.53 | +| 0.7 | 1.10 1.05 1.26 1.36 1.95 | 1.08 1.06 1.22 1.36 1.88 | 0.70 0.79 0.76 0.55 0.67 | 1.26 1.52 1.47 1.00 1.00 | 0.87 0.94 0.97 0.81 1.36 | +| 0.8 | 1.11 1.09 1.29 1.39 1.97 | 1.09 1.05 1.25 1.45 1.74 | 0.71 0.83 0.79 0.51 0.76 | 1.24 1.57 1.38 0.87 0.87 | 0.81 0.90 0.94 0.91 1.24 | +| 0.9 | 1.12 1.10 1.30 1.40 1.75 | 1.10 1.07 1.26 1.41 1.73 | 0.74 0.89 0.77 0.47 0.57 | 1.13 1.54 1.19 0.85 0.73 | 0.72 0.75 0.88 0.82 0.97 | +----------------------------------------------------------------------------------------------------------------------------------------------------- +] + +[pre + ---------------------------------------------------------------------------------------------------------------------------------------- + | sizeof(element): 32 | + ---------------------------------------------------------------------------------------------------------------------------------------- + | insert, erase, insert | ins, erase, ins, destroy | range for | for_each | sort | + ---------------------------------------------------------------------------------------------------------------------------------------- + | container size | container size | container size | container size | container size | +----------------------------------------------------------------------------------------------------------------------------------------------------- +| erase rate | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | +----------------------------------------------------------------------------------------------------------------------------------------------------- +| 0 | 1.06 1.44 1.51 1.41 1.38 | 1.04 1.01 1.02 1.04 1.50 | 0.72 0.69 0.70 0.72 0.73 | 1.44 1.56 1.52 1.23 0.97 | 0.95 0.99 0.99 1.03 1.59 | +| 0.1 | 1.06 1.04 1.14 1.56 1.44 | 1.04 1.01 1.03 1.11 1.47 | 0.74 0.71 0.65 0.64 0.66 | 1.48 1.51 1.48 1.14 0.90 | 0.94 0.98 0.99 0.99 1.55 | +| 0.2 | 1.06 1.04 1.16 1.55 1.51 | 1.04 1.01 1.05 1.40 1.56 | 0.73 0.71 0.66 0.64 0.66 | 1.40 1.50 1.46 1.05 0.87 | 0.94 0.98 0.99 0.99 1.50 | +| 0.3 | 1.06 1.05 1.20 1.75 1.65 | 1.05 1.02 1.09 1.43 1.72 | 0.74 0.75 0.68 0.66 0.68 | 1.30 1.47 1.48 1.13 0.93 | 0.93 0.98 0.99 0.94 1.45 | +| 0.4 | 1.08 1.06 1.25 1.77 1.69 | 1.04 1.02 1.13 1.41 1.68 | 0.75 0.72 0.70 0.67 0.72 | 1.40 1.49 1.49 1.13 1.11 | 0.93 1.24 0.99 1.00 1.36 | +| 0.5 | 1.09 1.08 1.20 1.64 1.86 | 1.05 1.03 1.16 1.45 1.91 | 0.74 0.75 0.73 0.67 0.77 | 1.30 1.51 1.46 1.15 1.11 | 0.92 0.99 0.98 0.86 1.28 | +| 0.6 | 1.10 1.08 1.23 1.60 1.89 | 1.06 1.04 1.19 1.73 1.78 | 0.76 0.77 0.76 0.68 0.82 | 1.34 1.54 1.40 0.93 0.97 | 0.91 0.95 0.97 0.81 1.23 | +| 0.7 | 1.11 1.10 1.27 1.62 2.05 | 1.07 1.05 1.22 1.75 1.72 | 0.74 0.80 0.77 0.73 0.79 | 1.26 1.57 1.21 0.94 0.89 | 0.89 0.92 0.95 0.76 1.09 | +| 0.8 | 1.12 1.11 1.29 1.57 1.85 | 1.09 1.06 1.24 1.69 2.07 | 0.79 0.83 0.76 0.67 0.60 | 1.24 1.55 1.09 0.81 0.77 | 0.86 0.85 0.92 0.91 1.00 | +| 0.9 | 1.13 1.15 1.29 1.75 1.62 | 1.10 1.09 1.24 1.64 1.70 | 0.77 0.88 0.79 0.48 0.50 | 1.15 1.58 1.26 0.88 0.67 | 0.70 0.74 0.85 0.84 0.84 | +----------------------------------------------------------------------------------------------------------------------------------------------------- +] + +[pre + ---------------------------------------------------------------------------------------------------------------------------------------- + | sizeof(element): 64 | + ---------------------------------------------------------------------------------------------------------------------------------------- + | insert, erase, insert | ins, erase, ins, destroy | range for | for_each | sort | + ---------------------------------------------------------------------------------------------------------------------------------------- + | container size | container size | container size | container size | container size | +----------------------------------------------------------------------------------------------------------------------------------------------------- +| erase rate | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | +----------------------------------------------------------------------------------------------------------------------------------------------------- +| 0 | 1.10 1.06 1.80 1.70 1.52 | 1.07 1.03 1.03 1.05 1.56 | 0.77 0.73 0.70 0.75 0.80 | 1.39 1.43 1.47 1.11 0.98 | 0.93 0.96 0.98 0.93 1.28 | +| 0.1 | 1.10 1.08 1.14 1.74 1.58 | 1.07 1.04 1.05 1.12 1.63 | 0.74 0.73 0.68 0.70 0.74 | 1.43 1.52 1.46 1.02 0.96 | 0.92 0.96 0.98 0.85 1.18 | +| 0.2 | 1.09 1.09 1.18 1.80 1.65 | 1.07 1.04 1.07 1.26 1.71 | 0.75 0.74 0.67 0.70 0.81 | 1.44 1.52 1.50 0.95 0.96 | 0.92 0.96 0.98 0.88 1.14 | +| 0.3 | 1.09 1.12 1.21 1.88 1.72 | 1.07 1.05 1.11 1.35 1.76 | 0.76 0.75 0.71 0.72 0.84 | 1.44 1.55 1.37 0.78 0.88 | 0.92 1.01 0.97 0.84 1.11 | +| 0.4 | 1.10 1.09 1.23 2.00 1.84 | 1.08 1.06 1.13 1.52 1.74 | 0.76 0.77 0.75 0.74 0.85 | 1.43 1.57 1.25 0.83 0.82 | 0.91 0.97 0.96 0.87 1.08 | +| 0.5 | 1.11 1.11 1.26 2.02 1.92 | 1.08 1.08 1.16 1.61 1.92 | 0.76 0.76 0.77 0.78 0.77 | 1.39 1.54 1.13 0.85 0.81 | 0.91 1.02 0.94 0.83 1.02 | +| 0.6 | 1.11 1.11 1.32 2.07 1.85 | 1.08 1.06 1.19 1.65 1.70 | 0.78 0.80 0.74 0.58 0.66 | 1.36 1.54 1.07 0.76 0.79 | 0.90 0.89 0.95 0.78 1.00 | +| 0.7 | 1.12 1.14 1.35 2.15 1.91 | 1.09 1.07 1.21 1.70 1.74 | 0.78 0.81 0.73 0.51 0.62 | 1.25 1.55 1.08 0.68 0.76 | 0.87 0.90 0.90 0.71 0.93 | +| 0.8 | 1.13 1.13 1.28 1.75 1.95 | 1.10 1.07 1.22 1.65 1.77 | 0.72 0.82 0.76 0.46 0.55 | 1.25 1.58 1.17 0.90 0.72 | 0.83 0.84 0.87 0.90 0.87 | +| 0.9 | 1.15 1.18 1.29 1.73 1.49 | 1.10 1.12 1.25 1.74 1.47 | 0.75 0.88 0.84 0.49 0.51 | 1.26 1.60 1.30 0.89 0.65 | 0.74 0.74 0.79 0.88 0.70 | +----------------------------------------------------------------------------------------------------------------------------------------------------- +] + +[pre + ---------------------------------------------------------------------------------------------------------------------------------------- + | sizeof(element): 80 | + ---------------------------------------------------------------------------------------------------------------------------------------- + | insert, erase, insert | ins, erase, ins, destroy | range for | for_each | sort | + ---------------------------------------------------------------------------------------------------------------------------------------- + | container size | container size | container size | container size | container size | +----------------------------------------------------------------------------------------------------------------------------------------------------- +| erase rate | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | +----------------------------------------------------------------------------------------------------------------------------------------------------- +| 0 | 1.06 1.05 1.85 1.77 1.66 | 1.05 1.01 1.02 1.09 1.70 | 0.76 0.73 0.73 0.85 0.93 | 1.32 1.40 1.33 0.89 0.92 | 0.97 0.98 1.00 0.85 1.03 | +| 0.1 | 1.05 1.04 1.11 1.75 1.63 | 1.05 1.00 1.02 1.14 1.67 | 0.76 0.75 0.71 0.78 0.88 | 1.34 1.40 1.33 0.95 0.96 | 0.97 0.97 0.98 0.75 0.90 | +| 0.2 | 1.05 1.04 1.13 1.77 1.71 | 1.04 1.01 1.04 1.30 1.71 | 0.76 0.75 0.71 0.85 0.90 | 1.46 1.42 1.28 0.88 0.93 | 0.97 0.97 0.97 0.71 0.87 | +| 0.3 | 1.05 1.05 1.16 1.85 1.75 | 1.03 1.01 1.08 1.42 1.86 | 0.76 0.74 0.72 0.91 0.90 | 1.36 1.42 1.18 0.85 0.85 | 0.98 0.97 0.97 0.71 0.86 | +| 0.4 | 1.06 1.04 1.22 1.92 1.83 | 1.03 1.02 1.11 1.53 1.94 | 0.76 0.76 0.72 0.91 0.84 | 1.34 1.43 1.08 0.90 0.83 | 0.98 0.97 0.98 0.68 0.84 | +| 0.5 | 1.04 1.05 1.21 1.99 1.81 | 1.03 1.02 1.13 1.61 1.98 | 0.79 0.76 0.72 0.81 0.72 | 1.31 1.44 1.04 0.86 0.84 | 0.98 1.02 0.97 0.66 0.82 | +| 0.6 | 1.05 1.07 1.28 2.05 1.81 | 1.04 1.02 1.16 1.61 1.71 | 0.75 0.77 0.70 0.59 0.67 | 1.30 1.44 1.01 0.78 0.82 | 0.98 0.92 0.96 0.63 0.79 | +| 0.7 | 1.05 1.06 1.26 2.08 1.92 | 1.04 1.04 1.18 1.65 1.86 | 0.75 0.76 0.71 0.52 0.63 | 1.29 1.43 1.05 0.69 0.80 | 0.97 0.91 0.95 0.58 0.74 | +| 0.8 | 1.07 1.07 1.22 1.65 2.03 | 1.05 1.05 1.20 1.62 1.77 | 0.74 0.79 0.74 0.60 0.59 | 1.19 1.46 1.09 0.75 0.76 | 0.95 0.87 0.93 0.89 0.66 | +| 0.9 | 1.09 1.09 1.23 1.66 1.54 | 1.08 1.05 1.21 1.67 1.36 | 0.75 0.85 0.81 0.47 0.56 | 1.16 1.50 1.21 0.83 0.71 | 0.87 0.78 0.86 0.80 0.58 | +----------------------------------------------------------------------------------------------------------------------------------------------------- +] + + +[endsect] + +[section:hub_clang_20_x86 Clang 20, x86] + +[pre + ---------------------------------------------------------------------------------------------------------------------------------------- + | sizeof(element): 16 | + ---------------------------------------------------------------------------------------------------------------------------------------- + | insert, erase, insert | ins, erase, ins, destroy | range for | for_each | sort | + ---------------------------------------------------------------------------------------------------------------------------------------- + | container size | container size | container size | container size | container size | +----------------------------------------------------------------------------------------------------------------------------------------------------- +| erase rate | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | +----------------------------------------------------------------------------------------------------------------------------------------------------- +| 0 | 1.08 1.27 1.43 1.37 1.24 | 1.11 1.07 1.08 1.19 1.31 | 0.64 0.63 0.63 0.63 0.65 | 1.10 1.18 1.18 1.17 1.18 | 1.05 1.04 1.02 1.46 2.62 | +| 0.1 | 1.11 1.08 1.19 1.47 1.28 | 1.14 1.10 1.12 1.23 1.31 | 0.64 0.62 0.60 0.60 0.62 | 1.11 1.18 1.14 1.06 1.06 | 1.00 1.02 1.00 1.28 2.45 | +| 0.2 | 1.14 1.11 1.23 1.72 1.40 | 1.17 1.13 1.17 1.40 1.38 | 0.64 0.63 0.60 0.60 0.62 | 1.10 1.18 1.13 1.05 1.04 | 1.00 1.03 1.00 1.32 2.39 | +| 0.3 | 1.15 1.14 1.28 1.62 1.48 | 1.18 1.15 1.22 1.45 1.45 | 0.64 0.64 0.61 0.59 0.62 | 1.09 1.19 1.14 1.03 1.03 | 1.00 1.10 1.00 1.24 2.24 | +| 0.4 | 1.18 1.16 1.32 1.58 1.53 | 1.20 1.19 1.27 1.37 1.57 | 0.64 0.64 0.62 0.59 0.64 | 1.08 1.19 1.18 1.01 1.02 | 0.99 0.89 0.99 1.14 2.14 | +| 0.5 | 1.21 1.18 1.38 1.68 1.64 | 1.23 1.20 1.33 1.40 1.64 | 0.63 0.64 0.62 0.59 0.66 | 1.06 1.20 1.20 1.02 1.02 | 0.99 0.90 0.99 1.19 2.00 | +| 0.6 | 1.24 1.21 1.44 1.65 1.65 | 1.26 1.24 1.39 1.47 1.66 | 0.63 0.65 0.64 0.57 0.72 | 1.06 1.21 1.20 0.95 1.05 | 0.95 0.90 0.98 1.01 1.81 | +| 0.7 | 1.27 1.24 1.42 1.57 1.70 | 1.29 1.27 1.43 1.52 1.69 | 0.64 0.66 0.65 0.56 0.82 | 1.06 1.22 1.21 0.96 1.12 | 0.93 0.90 0.97 0.96 1.68 | +| 0.8 | 1.31 1.26 1.47 1.55 1.72 | 1.31 1.29 1.48 1.55 1.71 | 0.64 0.69 0.68 0.53 0.84 | 1.06 1.25 1.21 1.01 0.98 | 0.87 0.87 0.94 0.90 1.45 | +| 0.9 | 1.32 1.28 1.49 1.48 1.68 | 1.34 1.32 1.50 1.52 1.68 | 0.66 0.76 0.70 0.50 0.67 | 1.02 1.37 1.09 1.03 0.80 | 0.78 0.80 0.88 0.86 1.07 | +----------------------------------------------------------------------------------------------------------------------------------------------------- +] + +[pre + ---------------------------------------------------------------------------------------------------------------------------------------- + | sizeof(element): 32 | + ---------------------------------------------------------------------------------------------------------------------------------------- + | insert, erase, insert | ins, erase, ins, destroy | range for | for_each | sort | + ---------------------------------------------------------------------------------------------------------------------------------------- + | container size | container size | container size | container size | container size | +----------------------------------------------------------------------------------------------------------------------------------------------------- +| erase rate | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | +----------------------------------------------------------------------------------------------------------------------------------------------------- +| 0 | 1.13 1.56 1.64 1.56 1.37 | 1.13 1.09 1.09 1.24 1.42 | 0.66 0.63 0.62 0.67 0.69 | 1.13 1.17 1.17 1.12 1.23 | 1.01 0.99 1.00 1.52 2.25 | +| 0.1 | 1.17 1.14 1.23 1.55 1.37 | 1.18 1.14 1.13 1.36 1.34 | 0.66 0.62 0.60 0.65 0.68 | 1.14 1.18 1.13 1.00 1.10 | 0.99 0.97 0.98 1.42 2.13 | +| 0.2 | 1.20 1.18 1.29 1.71 1.38 | 1.21 1.17 1.20 1.49 1.52 | 0.66 0.63 0.60 0.66 0.71 | 1.14 1.18 1.13 0.99 1.10 | 0.98 0.97 0.97 1.38 2.03 | +| 0.3 | 1.22 1.20 1.40 2.03 1.48 | 1.23 1.20 1.26 1.53 1.62 | 0.67 0.63 0.60 0.68 0.76 | 1.15 1.18 1.14 1.00 1.09 | 0.98 0.92 0.97 1.38 1.98 | +| 0.4 | 1.25 1.23 1.45 1.93 1.53 | 1.26 1.23 1.32 1.62 1.68 | 0.65 0.63 0.61 0.73 0.85 | 1.16 1.18 1.17 1.04 1.07 | 0.98 1.02 0.97 1.28 1.84 | +| 0.5 | 1.29 1.26 1.39 1.99 1.54 | 1.29 1.25 1.38 1.70 1.68 | 0.65 0.64 0.61 0.82 0.96 | 1.12 1.18 1.16 1.14 1.09 | 0.97 0.91 0.96 1.22 1.72 | +| 0.6 | 1.32 1.30 1.45 1.97 1.50 | 1.32 1.29 1.43 1.78 1.72 | 0.65 0.65 0.63 0.84 1.00 | 1.14 1.19 1.14 1.08 1.06 | 0.95 0.92 0.95 1.16 1.67 | +| 0.7 | 1.34 1.34 1.51 1.83 1.61 | 1.34 1.33 1.49 1.75 1.69 | 0.65 0.67 0.64 0.90 0.81 | 1.12 1.22 1.09 0.93 0.99 | 0.93 0.92 0.94 1.06 1.54 | +| 0.8 | 1.39 1.38 1.57 1.91 1.59 | 1.37 1.36 1.54 1.83 1.79 | 0.64 0.70 0.64 0.55 0.69 | 1.08 1.26 0.99 0.98 0.87 | 0.89 0.90 0.92 0.86 1.38 | +| 0.9 | 1.39 1.42 1.59 1.96 1.46 | 1.39 1.40 1.57 1.82 1.56 | 0.67 0.75 0.68 0.47 0.58 | 1.06 1.32 1.12 0.98 0.81 | 0.75 0.77 0.85 0.82 0.97 | +----------------------------------------------------------------------------------------------------------------------------------------------------- +] + +[pre + ---------------------------------------------------------------------------------------------------------------------------------------- + | sizeof(element): 64 | + ---------------------------------------------------------------------------------------------------------------------------------------- + | insert, erase, insert | ins, erase, ins, destroy | range for | for_each | sort | + ---------------------------------------------------------------------------------------------------------------------------------------- + | container size | container size | container size | container size | container size | +----------------------------------------------------------------------------------------------------------------------------------------------------- +| erase rate | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | +----------------------------------------------------------------------------------------------------------------------------------------------------- +| 0 | 1.26 1.30 2.42 2.15 1.73 | 1.32 1.27 1.26 1.30 1.79 | 0.64 0.61 0.61 0.76 0.90 | 1.12 1.16 1.16 0.98 0.95 | 1.01 1.06 1.05 1.26 1.58 | +| 0.1 | 1.29 1.37 1.42 1.90 1.65 | 1.34 1.31 1.28 1.46 1.67 | 0.65 0.61 0.59 0.74 0.88 | 1.06 1.15 1.11 0.96 0.95 | 1.01 1.05 0.98 1.07 1.42 | +| 0.2 | 1.35 1.42 1.52 1.90 1.65 | 1.39 1.35 1.33 1.53 1.71 | 0.66 0.62 0.59 0.75 0.99 | 1.14 1.16 1.10 0.99 0.97 | 1.01 1.06 1.01 1.00 1.28 | +| 0.3 | 1.35 1.44 1.60 1.98 1.60 | 1.40 1.37 1.40 1.61 1.66 | 0.65 0.63 0.61 0.81 0.94 | 1.13 1.17 1.10 0.94 0.94 | 1.00 1.11 1.05 0.94 1.23 | +| 0.4 | 1.40 1.48 1.66 2.08 1.69 | 1.37 1.41 1.45 1.76 1.70 | 0.66 0.65 0.63 0.91 0.92 | 1.15 1.19 1.10 0.92 0.90 | 1.00 1.02 1.04 0.93 1.17 | +| 0.5 | 1.43 1.53 1.72 2.08 1.66 | 1.42 1.45 1.54 1.78 1.72 | 0.66 0.66 0.62 0.88 0.81 | 1.14 1.21 1.02 0.98 0.90 | 0.99 1.08 1.05 0.89 1.13 | +| 0.6 | 1.47 1.57 1.80 2.06 1.68 | 1.43 1.49 1.60 1.78 1.72 | 0.68 0.67 0.63 0.80 0.74 | 1.15 1.22 0.97 0.93 0.86 | 1.00 1.03 1.06 0.84 1.08 | +| 0.7 | 1.48 1.59 1.87 2.06 1.60 | 1.48 1.50 1.66 1.79 1.69 | 0.69 0.67 0.58 0.61 0.65 | 1.09 1.23 0.96 0.81 0.85 | 0.97 0.98 1.00 0.76 1.00 | +| 0.8 | 1.53 1.63 1.78 1.77 1.57 | 1.52 1.55 1.70 1.77 1.68 | 0.65 0.68 0.57 0.51 0.60 | 1.10 1.27 0.95 0.93 0.82 | 0.93 0.92 0.95 0.92 0.91 | +| 0.9 | 1.58 1.68 1.81 1.74 1.39 | 1.56 1.59 1.72 1.72 1.41 | 0.67 0.78 0.69 0.47 0.58 | 1.05 1.36 1.10 0.99 0.81 | 0.83 0.83 0.95 0.88 0.76 | +----------------------------------------------------------------------------------------------------------------------------------------------------- +] + +[pre + ---------------------------------------------------------------------------------------------------------------------------------------- + | sizeof(element): 80 | + ---------------------------------------------------------------------------------------------------------------------------------------- + | insert, erase, insert | ins, erase, ins, destroy | range for | for_each | sort | + ---------------------------------------------------------------------------------------------------------------------------------------- + | container size | container size | container size | container size | container size | +----------------------------------------------------------------------------------------------------------------------------------------------------- +| erase rate | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | +----------------------------------------------------------------------------------------------------------------------------------------------------- +| 0 | 1.50 1.32 2.71 2.28 1.86 | 1.40 1.34 1.45 2.26 1.87 | 0.63 0.61 0.61 0.85 0.96 | 1.16 1.18 1.21 0.98 0.93 | 1.00 1.03 0.91 1.28 1.49 | +| 0.1 | 1.52 1.48 1.52 2.01 1.70 | 1.42 1.39 1.54 1.88 1.71 | 0.64 0.61 0.59 0.85 0.98 | 1.19 1.23 1.18 0.97 0.98 | 0.97 0.99 1.00 1.12 1.33 | +| 0.2 | 1.55 1.52 1.62 2.06 1.70 | 1.47 1.42 1.50 1.93 1.67 | 0.64 0.62 0.59 0.93 0.98 | 1.20 1.24 1.17 1.08 0.97 | 0.97 1.00 0.99 0.95 1.22 | +| 0.3 | 1.59 1.57 1.65 2.08 1.72 | 1.50 1.45 1.45 1.63 1.70 | 0.63 0.62 0.59 0.81 0.89 | 1.20 1.19 1.11 1.02 0.89 | 0.96 1.01 0.98 0.92 1.15 | +| 0.4 | 1.65 1.61 1.73 2.05 1.73 | 1.55 1.50 1.53 1.79 1.77 | 0.63 0.61 0.57 0.91 0.76 | 1.20 1.25 1.03 0.92 0.87 | 0.96 1.12 0.98 0.85 1.07 | +| 0.5 | 1.68 1.64 1.88 2.16 1.72 | 1.59 1.54 1.60 1.83 1.69 | 0.63 0.62 0.58 0.79 0.67 | 1.19 1.26 0.98 0.93 0.87 | 0.95 1.16 0.97 0.80 1.03 | +| 0.6 | 1.72 1.68 1.94 2.12 1.69 | 1.62 1.57 1.65 1.84 1.71 | 0.63 0.61 0.57 0.64 0.62 | 1.19 1.26 0.96 0.82 0.85 | 0.96 1.08 0.96 0.73 0.95 | +| 0.7 | 1.74 1.70 2.02 2.08 1.70 | 1.64 1.59 1.71 1.85 1.64 | 0.63 0.60 0.56 0.51 0.56 | 1.16 1.23 0.97 0.79 0.85 | 0.96 0.98 0.95 0.64 0.89 | +| 0.8 | 1.78 1.74 1.97 2.05 1.65 | 1.68 1.64 1.72 1.82 1.66 | 0.61 0.61 0.58 0.65 0.53 | 1.11 1.26 1.01 1.16 0.81 | 0.90 0.97 0.91 0.87 0.82 | +| 0.9 | 1.79 1.75 2.04 1.76 1.40 | 1.70 1.66 1.78 1.75 1.32 | 0.63 0.65 0.65 0.49 0.53 | 1.08 1.31 1.16 1.02 0.79 | 0.84 0.82 0.87 0.74 0.70 | +----------------------------------------------------------------------------------------------------------------------------------------------------- +] + + +[endsect] + +[section:hub_vs_2022_x86 VS 2022, x86] + +[pre + ---------------------------------------------------------------------------------------------------------------------------------------- + | sizeof(element): 16 | + ---------------------------------------------------------------------------------------------------------------------------------------- + | insert, erase, insert | ins, erase, ins, destroy | range for | for_each | sort | + ---------------------------------------------------------------------------------------------------------------------------------------- + | container size | container size | container size | container size | container size | +----------------------------------------------------------------------------------------------------------------------------------------------------- +| erase rate | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | +----------------------------------------------------------------------------------------------------------------------------------------------------- +| 0 | 0.99 1.12 1.03 1.07 1.17 | 1.02 0.99 1.01 1.01 1.17 | 0.63 0.61 0.60 0.60 0.53 | 0.95 0.99 0.98 0.96 0.77 | 1.02 1.06 1.05 1.07 1.83 | +| 0.1 | 1.02 0.99 1.02 1.09 1.00 | 1.04 1.01 1.03 1.03 1.16 | 0.62 0.62 0.60 0.60 0.53 | 0.92 0.90 0.88 0.87 0.70 | 0.98 1.04 1.03 1.05 1.79 | +| 0.2 | 1.03 1.01 1.05 1.13 1.27 | 1.05 1.02 1.06 1.11 1.22 | 0.61 0.61 0.59 0.59 0.51 | 0.95 0.89 0.86 0.84 0.67 | 0.98 1.03 1.03 1.03 1.77 | +| 0.3 | 1.05 1.04 1.10 1.15 1.28 | 1.06 1.05 1.09 1.13 1.24 | 0.61 0.60 0.58 0.58 0.48 | 0.94 0.87 0.84 0.82 0.64 | 0.97 1.02 1.02 1.02 1.72 | +| 0.4 | 1.05 1.09 1.14 1.17 1.22 | 1.07 1.09 1.14 1.05 1.23 | 0.61 0.59 0.57 0.57 0.47 | 0.95 0.92 0.82 0.81 0.61 | 0.97 1.01 1.02 1.01 1.64 | +| 0.5 | 1.07 1.14 1.18 1.21 1.35 | 1.08 1.14 1.17 1.22 1.33 | 0.59 0.58 0.56 0.56 0.45 | 0.93 0.92 0.82 0.79 0.57 | 0.96 1.04 1.02 0.99 1.63 | +| 0.6 | 1.09 1.18 1.21 1.24 1.44 | 1.10 1.18 1.21 1.26 1.40 | 0.66 0.56 0.54 0.54 0.44 | 0.94 0.97 0.82 0.76 0.55 | 0.94 1.00 1.01 0.98 1.55 | +| 0.7 | 1.11 1.20 1.24 1.26 1.45 | 1.12 1.20 1.24 1.29 1.42 | 0.66 0.56 0.51 0.51 0.43 | 0.92 0.99 0.82 0.71 0.52 | 0.93 0.99 1.01 0.97 1.51 | +| 0.8 | 1.12 1.21 1.27 1.30 1.48 | 1.14 1.21 1.26 1.29 1.47 | 0.64 0.65 0.49 0.47 0.43 | 0.84 0.99 0.87 0.64 0.51 | 0.89 1.07 0.98 1.00 1.31 | +| 0.9 | 1.14 1.22 1.28 1.29 1.50 | 1.15 1.22 1.27 1.27 1.48 | 0.57 0.71 0.60 0.46 0.47 | 0.69 0.99 0.84 0.58 0.55 | 0.79 1.02 0.93 0.96 1.09 | +----------------------------------------------------------------------------------------------------------------------------------------------------- +] + +[pre + ---------------------------------------------------------------------------------------------------------------------------------------- + | sizeof(element): 32 | + ---------------------------------------------------------------------------------------------------------------------------------------- + | insert, erase, insert | ins, erase, ins, destroy | range for | for_each | sort | + ---------------------------------------------------------------------------------------------------------------------------------------- + | container size | container size | container size | container size | container size | +----------------------------------------------------------------------------------------------------------------------------------------------------- +| erase rate | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | +----------------------------------------------------------------------------------------------------------------------------------------------------- +| 0 | 0.96 1.02 0.95 0.96 1.18 | 0.97 0.94 0.95 0.94 1.17 | 0.64 0.60 0.59 0.55 0.52 | 1.06 1.07 1.05 0.73 0.73 | 1.05 1.03 1.03 1.09 1.80 | +| 0.1 | 0.95 0.94 0.97 1.00 1.19 | 0.98 0.97 0.98 1.05 1.11 | 0.64 0.61 0.59 0.55 0.52 | 1.01 0.97 0.94 0.75 0.67 | 0.98 1.01 1.01 1.10 1.88 | +| 0.2 | 0.97 0.95 1.01 1.06 1.23 | 1.00 0.98 1.02 1.10 1.27 | 0.63 0.60 0.58 0.54 0.52 | 1.01 0.95 0.92 0.72 0.61 | 0.98 1.01 1.00 1.19 1.89 | +| 0.3 | 0.98 1.00 1.04 1.14 1.33 | 1.01 1.01 1.05 1.11 1.25 | 0.63 0.59 0.58 0.53 0.51 | 1.00 0.93 0.89 0.68 0.64 | 0.98 1.01 1.01 1.16 1.87 | +| 0.4 | 0.99 1.04 1.09 1.19 1.32 | 1.01 1.06 1.09 1.17 1.27 | 0.63 0.58 0.56 0.51 0.51 | 1.05 0.96 0.87 0.68 0.63 | 0.97 1.01 1.04 1.07 1.72 | +| 0.5 | 1.01 1.08 1.13 1.28 1.40 | 1.03 1.10 1.13 1.37 1.37 | 0.66 0.57 0.55 0.50 0.52 | 1.07 0.99 0.85 0.65 0.64 | 0.98 1.01 0.99 1.10 1.74 | +| 0.6 | 1.03 1.13 1.16 1.40 1.47 | 1.05 1.15 1.15 1.47 1.42 | 0.67 0.57 0.53 0.52 0.51 | 1.08 1.06 0.85 0.65 0.61 | 0.97 1.00 0.99 1.07 1.72 | +| 0.7 | 1.05 1.15 1.20 1.36 1.48 | 1.08 1.17 1.20 1.33 1.54 | 0.71 0.58 0.52 0.53 0.53 | 1.04 1.14 0.84 0.73 0.63 | 0.97 1.00 0.99 1.04 1.68 | +| 0.8 | 1.07 1.18 1.23 1.37 1.52 | 1.09 1.19 1.21 1.46 1.47 | 0.68 0.65 0.55 0.53 0.53 | 0.92 1.11 0.90 0.74 0.62 | 0.90 1.11 0.96 0.98 1.54 | +| 0.9 | 1.09 1.19 1.25 1.52 1.47 | 1.11 1.19 1.25 1.37 1.47 | 0.60 0.75 0.56 0.41 0.43 | 0.76 1.03 0.83 0.59 0.56 | 1.43 1.13 0.93 0.95 1.36 | +----------------------------------------------------------------------------------------------------------------------------------------------------- +] + +[pre + ---------------------------------------------------------------------------------------------------------------------------------------- + | sizeof(element): 64 | + ---------------------------------------------------------------------------------------------------------------------------------------- + | insert, erase, insert | ins, erase, ins, destroy | range for | for_each | sort | + ---------------------------------------------------------------------------------------------------------------------------------------- + | container size | container size | container size | container size | container size | +----------------------------------------------------------------------------------------------------------------------------------------------------- +| erase rate | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | +----------------------------------------------------------------------------------------------------------------------------------------------------- +| 0 | 0.99 1.09 1.00 0.96 ---- | 1.00 1.09 1.24 1.12 ---- | 0.66 0.63 0.61 0.54 ---- | 1.05 1.04 0.99 0.67 ---- | 0.99 1.06 1.00 1.19 ---- | +| 0.1 | 1.01 1.10 1.28 1.05 ---- | 1.02 1.11 1.23 1.11 ---- | 0.68 0.63 0.61 0.52 ---- | 1.01 0.95 0.89 0.61 ---- | 0.94 1.03 1.01 1.04 ---- | +| 0.2 | 1.04 1.13 1.28 1.15 ---- | 1.04 1.13 1.32 1.15 ---- | 0.67 0.62 0.60 0.53 ---- | 1.01 0.93 0.86 0.60 ---- | 0.95 1.03 0.97 0.98 ---- | +| 0.3 | 1.05 1.15 1.37 1.19 ---- | 1.06 1.15 1.30 1.23 ---- | 0.67 0.62 0.58 0.51 ---- | 1.01 0.92 0.84 0.60 ---- | 0.96 1.03 1.04 1.01 ---- | +| 0.4 | 1.07 1.19 1.44 1.27 ---- | 1.08 1.19 1.41 1.31 ---- | 0.67 0.62 0.56 0.49 ---- | 1.06 0.92 0.80 0.59 ---- | 0.95 1.03 1.01 0.92 ---- | +| 0.5 | 1.08 1.22 1.41 1.34 ---- | 1.09 1.23 1.37 1.28 ---- | 0.67 0.60 0.56 0.49 ---- | 1.07 0.93 0.78 0.57 ---- | 0.96 1.03 1.00 0.97 ---- | +| 0.6 | 1.10 1.25 1.41 1.40 ---- | 1.10 1.25 1.37 1.38 ---- | 0.72 0.62 0.53 0.47 ---- | 1.09 0.93 0.83 0.58 ---- | 0.95 1.04 1.02 0.91 ---- | +| 0.7 | 1.11 1.27 1.43 1.43 ---- | 1.10 1.27 1.37 1.39 ---- | 0.72 0.58 0.54 0.45 ---- | 1.02 0.95 0.76 0.53 ---- | 0.94 1.05 1.01 0.93 ---- | +| 0.8 | 1.11 1.29 1.45 1.40 ---- | 1.11 1.28 1.40 1.40 ---- | 0.72 0.66 0.48 0.59 ---- | 0.95 1.07 0.73 0.73 ---- | 0.87 1.20 1.10 1.03 ---- | +| 0.9 | 1.12 1.29 1.49 1.41 ---- | 1.12 1.28 1.39 1.44 ---- | 0.62 0.73 0.48 0.43 ---- | 0.75 1.04 0.66 0.59 ---- | 0.81 1.33 1.16 1.06 ---- | +----------------------------------------------------------------------------------------------------------------------------------------------------- +] + +[pre + ---------------------------------------------------------------------------------------------------------------------------------------- + | sizeof(element): 80 | + ---------------------------------------------------------------------------------------------------------------------------------------- + | insert, erase, insert | ins, erase, ins, destroy | range for | for_each | sort | + ---------------------------------------------------------------------------------------------------------------------------------------- + | container size | container size | container size | container size | container size | +----------------------------------------------------------------------------------------------------------------------------------------------------- +| erase rate | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | 1.E3 1.E4 1.E5 1.E6 1.E7 | +----------------------------------------------------------------------------------------------------------------------------------------------------- +| 0 | 0.99 1.34 0.96 0.98 ---- | 1.00 1.10 1.31 1.14 ---- | 0.63 0.62 0.59 0.55 ---- | 1.09 1.07 0.99 0.64 ---- | 0.96 1.05 1.01 0.98 ---- | +| 0.1 | 1.01 1.10 1.23 1.00 ---- | 1.02 1.13 1.25 1.16 ---- | 0.64 0.63 0.59 0.54 ---- | 1.04 0.98 0.88 0.63 ---- | 0.91 1.04 1.00 0.96 ---- | +| 0.2 | 1.03 1.12 1.24 1.08 ---- | 1.03 1.15 1.33 1.16 ---- | 0.64 0.61 0.58 0.52 ---- | 1.05 0.94 0.85 0.62 ---- | 0.92 1.03 0.99 0.91 ---- | +| 0.3 | 1.03 1.16 1.32 1.16 ---- | 1.05 1.18 1.33 1.22 ---- | 0.64 0.60 0.56 0.51 ---- | 1.03 0.92 0.80 0.60 ---- | 0.92 1.03 1.00 0.98 ---- | +| 0.4 | 1.06 1.19 1.35 1.24 ---- | 1.07 1.21 1.36 1.28 ---- | 0.64 0.61 0.56 0.50 ---- | 1.10 0.90 0.76 0.58 ---- | 0.92 1.03 1.01 0.97 ---- | +| 0.5 | 1.07 1.24 1.34 1.32 ---- | 1.08 1.25 1.46 1.30 ---- | 0.64 0.63 0.63 0.50 ---- | 1.12 0.92 0.79 0.59 ---- | 0.93 1.04 1.03 0.98 ---- | +| 0.6 | 1.09 1.26 1.40 1.41 ---- | 1.09 1.27 1.43 1.37 ---- | 0.66 0.59 0.60 0.46 ---- | 1.10 0.96 0.83 0.58 ---- | 0.92 1.07 1.03 0.95 ---- | +| 0.7 | 1.10 1.28 1.41 1.40 ---- | 1.10 1.31 1.39 1.37 ---- | 0.68 0.57 0.51 0.45 ---- | 1.03 1.01 0.71 0.58 ---- | 0.91 1.08 1.08 0.91 ---- | +| 0.8 | 1.12 1.31 1.47 1.43 ---- | 1.11 1.31 1.49 1.44 ---- | 0.68 0.65 0.47 0.49 ---- | 0.98 1.08 0.68 0.55 ---- | 0.84 1.23 1.05 1.06 ---- | +| 0.9 | 1.13 1.29 1.43 1.41 ---- | 1.12 1.32 1.46 1.46 ---- | 0.59 0.71 0.48 0.42 ---- | 0.78 1.04 0.63 0.56 ---- | 0.80 1.46 1.18 1.09 ---- | +----------------------------------------------------------------------------------------------------------------------------------------------------- +] + +[endsect] + +[endsect] + +[endsect] + [endsect] [section:extended_functionality Extended functionality: Basic extensions] diff --git a/doc/images/hub_250_256.png b/doc/images/hub_250_256.png new file mode 100644 index 0000000000000000000000000000000000000000..9dd8e45102edfe55b502feb0f829b75df8db9e02 GIT binary patch literal 2850 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 literal 0 HcmV?d00001 diff --git a/doc/images/hub_250_512.png b/doc/images/hub_250_512.png new file mode 100644 index 0000000000000000000000000000000000000000..856ff079a8d9855a0ef52170e46740f38a1c7afc GIT binary patch literal 3531 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 literal 0 HcmV?d00001 diff --git a/doc/images/hub_500_1024.png b/doc/images/hub_500_1024.png new file mode 100644 index 0000000000000000000000000000000000000000..f6ccc8103b8ad623fe56f6514f648de2711fd126 GIT binary patch literal 6002 zcmeAS@N?(olHy`uVBq!ia0y~yV9{h?U|7z<#K6F?IdNh)0|NtNage(c!@6@aFBupZ zSkfJR9T^xl_H+M9WMyDr;4JWnEM{QfI}E~%$MaXDFffR-d%8G=RK&f#t6P5O#-*bl z4;*lCc0Sw~=h)WP$lSb#iG3C?Psxn~8`2ld)aT*(!p_0LW5P4%`HJs(d%sx5p6Xt! zxAVXK1ns$6E6dMEEneJ}Z>0Z^nSp_!Vfpblj0_A637lu-7#J8BrX3)}wQ1eGT712I z&Bv2r#fBd?|7B?Sb3>uv$_(2Aj;AwsZk?9?d^-R7dNr+RZU&VNSIRycSF=d7^hs@I zpJrZ_G;R4;uX*#%$T4g%JDqEOM(zNA(zgSTcJV%Vbx!^3<;`ni?oN$2`?c?E=(gB9 zmo3f8L%-kLUA{uf%zN*pFu(Q-lh{=IV{rpS!>_l7ctAOo%BnYkwJL! z^UqIC=JvW5W>&wlO$ttLKCm(A+X2R$dHqjs-mo=nXWx?BZFk4^R^*!3%8Rc)e7S$8 z*Zf_UGSg&JuNZJe@U^dS{`}&Y@Y&g4rk94so5=Wynb*FP=b9|Q&>(sD^XBS?zIo4@ zF9w%aOvzs-A$N7L`j++brakYhDsA}BE|%t>RsLfA%T@c5EavFs{kmf>qQ=>VNqCsI;<_ThHtNDeU%6 zw5WB;QpGJB91}!m*lyVJ?x97MQJDXgkB7chT)JXEGkR|F+O2!TdCx-}sb+q=+bM=0DeXdve$vpiDoSWIjuG?z;ZvXfsCHYUs+kW@l!-<=Vb4sozoDV(BcPaMi z;fuyKE27KazJ9jtQs%uS|97l=#od1RSb8Budh$O zxIg3G!vAa5y;|J{QFflKacknY1B@m77uUWLw5-eN>ub-Bx_a`X$M=ADU;RH^3q8DV zW8|HGyef6q#BWD`)n1w(GhgfIulEn6YVT|_`N?juL{{}?$kv@D`&-j~+lez6NX*;X z`}SEtwady4jt?pfs~N1_q#ZJDbTTj;Z?a|jp?gN|K%e}b@Ec(a4>&fuGwg4@$$aBu z^6##?6Mvcae`RH;aJ!-0aQ_gYjL1MZ*H)+ZzrVk~{@0h6e}8|^zqe=SjvW^E_VtVm z6@BNg;qpFS{G7uY7mV4-EdW2#SDf8A;g z@hPwOaxqw_#qY1H{r&B&zQ00_DnmnU^hty2DR&9yuV!F)qp|zw z)2B=Qza?lhGO%o!TC&;wr~JQr&I||a`1$$O)z$58Hm_x25V#O_>8#xQdwYK$w0GxV zu<+Yl-!um#t{vU^e~l%ml(f-I;|I~+3Ex1}1{QL-6@|66f0JzQ?W=wLKy=>;#}BTX zEZg*h*1XvL!F5xmS^N@e?NVt2?zAb+^-NM0s?I4=}?98Ysm(_JQ z^Ln0nHYfLla-URqaOdJ#sky2+Jft)` zuj|zv(a^iIW-qcTcMaYCY}tx)u~6ylD-Pc6)LiZiqT8SO=$?8xdD_i3m9*k>W={m& zdsnYK68JbvtMJN>Sza=x>y`<@g}SotRTc$@9AA&$A24r5UwQEE$dtM;R-z@&Av3d)mCy}Y2CRq%bGWpH=VuO+G5 z6gzLu+00vs%PSz?buF4zKJSjm)sHyh1LhByw3z7*Ys04{FT_lD{Jt<}rK@G_C8OID zj^v!X*=7TB_f*tafeX0?p0)PR>w5JAM|{Bi0h8{Qx-)l1kyS~z)ScRlb5|D4vCEv9 z>yc#kJjYoMj#qOW9qnyzlHx(z62n=5IM; zreZj|c$;EB4zGaITwuuObCYK;vZ_N%SLptLO5a_?R<6Em4j+h?pJlvNW4V7+n)IX@ zXDx3}a7RsGaIb*VoW`ok=O=vwW%on#2QGg=r9s(dH2V~qj%J_H>;o#YN3+jp?UNPb zOTXIZ_2VC+)2|=isjauZy%@b21#2;Jw&xWd_p&JIw!Vf#CA7gMYH4r({i4*IdGmhF zFKN{;5~!J&)Az7jMEjRs&BUB}XT>%99^Nm9H0mn-;#1y>fO_@}{T(+!o$dodGi*Wa zMx92y+=a7k^YZiM<>X5E7%ZIr|NFhZpMjym=gwwA?dz`zF+8ZK`TcEe4&&4C`OIM1#XI)ywY9Z<>OY71z{Z_BcI?=>^CKq%ga66R z?uE6rwPj`BzP<*jowv2Uz5Vp*)8_g2e#kI1sGFUUJ9_r)+126e?dtx#C}ucd{PpGK z<@W!6Jbrt7yB#~jgO|Q({fpkXiHnObU%uQ&f#HMB*YlPC+MF2<94brae_6il`}_OT zlh-pbguVXv@8A6Te-F#2Gcd4UnP#2*Yetvq&&2V7W-1+nOSAXwY$;?pT za1q>FV(4$h8>0Bb8zEcJ@@`$+o_`;XsxvS!M6hjU7y9+-;n(hiS7Z0yS-(|0UB|q7 zN{J7sD{$ydW6Q3}MN%rK4s3{h!}rzee$1SsAh#4SoRRZbVOs6;tTorUxX^uj&h1w( zHkEySweHWRi(hm5+h?DTU3&CwWO{n)4p9b%0~Zs%IXEp2|NVBt2IGh+(|-hI=>0mf zYkTc>p1ZY=_r3aYTx;>pgXQ<@uNGKbY4?~c%)rpF`0$&?E4#{npRNA$VbcDEjth3a z5T2>?_3iDeJ8ntJn!hd%pZaM_xdk%=gN4}{IgfMiKmN7em$7x{3t>&~;K`PX>&o1Y zKh{jv+L2{c{X*_&1t$Z;gA9Xeg`ID!|NOYSZ$9&^?&QgBai8by{rKudg-!LJ524nZ zkGqvGKE}(yz%b7`jsHn;`PKci`tMyn&HcA*iv-{7?&PyqH?5d`?CQ&p2Dknk2|etp z{5Xt(q2cjCP&iGmmfpXF|McRk&mKj5|8@U$dwXti%-y$l`ULIEr_Od0&wbC#z);{r zROUcL7QURc>*nKc-@ZM3==dC@>cfkFf4|?)`(|NpzkmP!>p~zgn_biO+$t}OKWTIo|U`5zuw-`^5>tQn?a*|3?Cx) z)&34U*83^jyjo=Y_U+4;FaOh74ARs8`q86D&z>!lsraU`ZvFc6=g#e``}+zk^@Eq6 zpMU!F>G}8eTzqLzEs`oz`SsP+&pWYY_a(M!%BV7OQr}__1x9V>bj7nqTbw z-0b=Kc;jk@1E&nC84lcf@%@kW?eh1DOY5EW*MA5vzdc`?=l$E>bHCc=32qB7_d2-x zQtYS8`Tr(c_nf^~wJYq_`ge7jj0_JJ%&=uhh~3qB;QgI{2OT~?XO5lS-+p!P+}-AP zu6f=5*7fnzIh_U7J|@eXF7m3Cy}Onnt^c#aoQXlfK8>FtVruRC_eOgr^#6`p|MG9t zk7e<@+>X}$6~F)cd+Pn2u~*I3eebL@WM+8K0J0@C>izq>**_fgpG@9&@`AyQ60)fYX*7sS}o3b!GC;;nu_5J%t?;iy=?{2R%vzBH)xFKYh z+EL%9c_q@?uY;{iGi#>!a6O(fTe|;UXzjUq{!9!@j=W)Hcx_ZAeO>@(QzG?>?Hi>BZzw`Mb00 zvcmt}lwoK%ob-*MAwAQ?-e#41_0#k+hK9$7-!L+qza)HCuHUlCppxOh#zc^kmzin( zd0#3f$uDPM=wsZ>4oa`82GyWc9l=CCx1#F*-|zoDR6lGFT-Cf7WSXa|pUXO@geCy$ C?tjn# literal 0 HcmV?d00001 diff --git a/doc/images/hub_500_512.png b/doc/images/hub_500_512.png new file mode 100644 index 0000000000000000000000000000000000000000..0b027dc83edbd3f9f257be0b0c1f0f7fe9857e88 GIT binary patch literal 3380 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 Y<@3Fzt6CWu7#J8lUHx3vIVCg!0HB%us{jB1 literal 0 HcmV?d00001 diff --git a/doc/images/hub_500_768.png b/doc/images/hub_500_768.png new file mode 100644 index 0000000000000000000000000000000000000000..8390e98766be340b02e53c5e80311c7ffd3a53a9 GIT binary patch literal 4062 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 GLK6V7fWT(} literal 0 HcmV?d00001 diff --git a/doc/images/hub_data_structure.png b/doc/images/hub_data_structure.png new file mode 100644 index 0000000000000000000000000000000000000000..005b22e644cff9b8a65139e980374285b3f320f1 GIT binary patch literal 5781 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 U)*cdKU|?YIboFyt=akR{06jw^i2wiq literal 0 HcmV?d00001 diff --git a/doc/images/hub_natvis.png b/doc/images/hub_natvis.png new file mode 100644 index 0000000000000000000000000000000000000000..7a5db70d090cc986201e6cfb989ed676cd852f77 GIT binary patch literal 16262 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 I>zopr09YKdS^xk5 literal 0 HcmV?d00001