Skip to content

runtime: use SwissTable #54766

@zhangyunhao116

Description

@zhangyunhao116
Contributor

Abstract

From ByteDance Programming Language Team

We suggest using SwissTable in the runtime to replace the original implementation of the hashmap.

SwissTable is now used in abseil and rust by default. We borrowed ideas from the two implementations and combined some optimization ideas of Go's original hashmap to construct the current implementation.

See the following comment for performance comparison(the GitHub issue has a character limit).

Motivations

  • We need to improve the performance of the hashmap as much as possible. At ByteDance, our Go service consumes about 4% of the CPU on hashmap. It is worth noting that on many services, the CPU consumption of mapassign and mapaccess are almost 1:1, so the improvement of insertion performance is equally important.

  • Support dynamic adjustment of the capacity of the hashmap. Some Go services will make a map too large due to burst traffic, which will cause a lot of pressure on the memory, but the map does not shrink after elements removal. We found that there are also many related discussions in the community:

Implementations

Tasks

  • Basic version: without SIMD, follow the original memory layout.
    Add SIMD support for x86: WIP, in the following CL.
    Aggregates all tophash into an array: In the plan, it requires more performance comparison data.
    Support hashmap resizing: More discussion is needed.
    Set bucketCnt to 4 on 32-bit platforms: More discussion is needed.

Advantages compared to the original implementation

  • The overall performance is better, and we can also use SIMD to improve performance.

  • SwissTable's LoadFactor can be set higher to save some memory.

  • Open-addressing and making dynamic adjustments to the capacity is easier to implement.

  • After allocating a fixed-size hashmap, if the number of inserted elements does not exceed the capacity, no additional memory is required, and the performance will be significantly improved, which has a greater advantage over reused fixed-size hashmap. (The original hashmap may still allocate additional memory even when the limit is not exceeded)

Disadvantages compared to the original implementation

  • The rehash is done at once, so

    • Some services that are sensitive to latency may experience performance degradation. (but we do not observe this for now)
    • In some cases, when the hashmap needs to grow, it may consume more CPU than the original implementation. (The previous implementation uses incremental rehash)
  • Since SwissTable needs to ensure that each bucket has at least one empty slot, it will cause performance degradation in some cases. For example, if we insert an element when there are seven elements in the hashmap, the CPU consumption will significantly increase because the hashmap needs to grow.

Implementation details

Here is an overview of the basic version. For more detailed implementation, you can read the code. Before reading the code, it is recommended to check the video or the article in the references to get a general idea of how it works.

Differences with SwissTable

  • Move tophash into the bucket, not as an array alone.

The classic SwissTable aggregates all tophash into an array (also called control bytes array, here we follow the convention, called tophash), while the original hashmap of Go puts tophash and items in the same bucket.

Our experiments outside the runtime found that if tophash is used as an array alone, we couldn’t find any performance wins. This is probably because we need two memory allocations when initializing the hashmap.

So we use the bucket memory layout almost the same as the original in the current version. In the future, we may consider aggregating all tophash into an array, using a data structure similar to sync.Pool, so that all tophash of the hashmap can be reused to improve performance.

Due to this change, when we delete a key/value, we only need to determine whether the current bucket still has empty slots, because the location where we access the bucket is relatively fixed, unlike the classic implementation, which can be accessed from different addresses.

Differences with the original implementation

For hashmap header (hmap) and hiter

  • Removed fields about overflow and incremental rehash.

For bucket (bmap)

  • The tophash is still 8-bit(uint8), but 7-bit for hash info and 1-bit as flags.

  • Removed overflow pointer.

For the way of querying

  • The query process changes from querying the overflow pointer to finding the next bucket (using triangular probing) until the first empty slot is found. SwissTable theoretically guarantees that there is at least one empty slot.

For initializing bucket arrays

  • The initial state of the tophash is 0xff instead of 0; 0xff represents the empty slot now.

References

Activity

zhangyunhao116

zhangyunhao116 commented on Aug 30, 2022

@zhangyunhao116
ContributorAuthor

Performance comparison

Here the SwissTable is just a basic version. To avoid a CL bringing too many changes, it does not use SIMD and is compatible with the previous hashmap memory layout(it means many optimizations are not included in this version). Its performance still has room for improvement; we will add these optimizations in subsequent CLs.

In general, the performance changes for the basic version of SwissTable are as follows.

  • There is a significant improvement (20% ~ 50%) when querying a large hashmap or querying an element that does not exist in the hashmap. When querying a hashmap with fewer elements, performance degradation is up to 20%.

  • Insertions and deletions have been significantly improved in almost all cases (20% ~ 50%).

  • The performance of iterate is improved by about 10%.

  • Memory usage is reduced by 0% ~ 25% in most cases. Reusing a fixed-size hashmap no longer consumes any extra memory.

  • Since the growth is done at once, the CPU usage is significantly reduced in the case of continuous growth, but in some cases, the CPU consumption may also increase significantly.

Platform

  • GO: linux/amd64

  • CPU: AMD 3700x(8C16T)

  • OS: Ubuntu 22.04.1 LTS (GNU/Linux 5.15.0-43-generic x86_64)

  • MEMORY: 16G x 2 (DDR4 3200MHz)

Benchmark-1

Located in https://github.com/zhangyunhao116/gomapbench

This benchmark contains performance comparisons of common operations of common types in different situations.

INFO
name                                   old time/op    new time/op    delta
MapIter/Int/6-16                         60.2ns ± 1%    55.7ns ± 0%    -7.35%  (p=0.000 n=9+7)
MapIter/Int/12-16                         121ns ±10%     102ns ± 3%   -15.51%  (p=0.000 n=10+10)
MapIter/Int/18-16                         173ns ± 2%     165ns ± 1%    -4.58%  (p=0.000 n=10+8)
MapIter/Int/24-16                         214ns ± 4%     194ns ± 3%    -9.46%  (p=0.000 n=10+10)
MapIter/Int/30-16                         287ns ± 3%     272ns ± 2%    -5.22%  (p=0.000 n=10+9)
MapIter/Int/64-16                         609ns ± 0%     572ns ± 3%    -6.10%  (p=0.000 n=7+10)
MapIter/Int/128-16                       1.21µs ± 4%    1.17µs ± 2%    -3.63%  (p=0.004 n=10+10)
MapIter/Int/256-16                       2.46µs ± 2%    2.23µs ± 2%    -9.31%  (p=0.000 n=10+10)
MapIter/Int/512-16                       4.98µs ± 4%    4.38µs ± 2%   -12.22%  (p=0.000 n=10+10)
MapIter/Int/1024-16                      9.94µs ± 3%    8.84µs ± 2%   -11.11%  (p=0.000 n=10+10)
MapIter/Int/2048-16                      20.1µs ± 3%    17.8µs ± 1%   -11.33%  (p=0.000 n=10+10)
MapIter/Int/4096-16                      39.7µs ± 1%    35.5µs ± 2%   -10.49%  (p=0.000 n=10+10)
MapIter/Int/8192-16                      79.3µs ± 2%    71.8µs ± 1%    -9.42%  (p=0.000 n=10+10)
MapIter/Int/65536-16                      631µs ± 2%     571µs ± 1%    -9.52%  (p=0.000 n=10+9)
MapAccessHit/Int64/6-16                  4.24ns ± 1%    3.71ns ± 1%   -12.37%  (p=0.000 n=8+9)
MapAccessHit/Int64/12-16                 6.61ns ± 6%    6.63ns ±11%      ~     (p=0.796 n=9+9)
MapAccessHit/Int64/18-16                 6.74ns ± 4%    7.01ns ± 1%    +4.02%  (p=0.002 n=9+8)
MapAccessHit/Int64/24-16                 7.81ns ± 8%    8.17ns ± 5%    +4.62%  (p=0.034 n=10+8)
MapAccessHit/Int64/30-16                 6.23ns ± 6%    6.99ns ± 1%   +12.34%  (p=0.000 n=10+7)
MapAccessHit/Int64/64-16                 6.68ns ± 6%    7.22ns ± 2%    +8.08%  (p=0.000 n=10+9)
MapAccessHit/Int64/128-16                6.98ns ± 6%    7.32ns ± 6%    +4.93%  (p=0.004 n=10+10)
MapAccessHit/Int64/256-16                7.12ns ± 2%    7.28ns ± 2%    +2.21%  (p=0.002 n=9+10)
MapAccessHit/Int64/512-16                7.68ns ± 4%    7.40ns ± 2%    -3.65%  (p=0.000 n=9+10)
MapAccessHit/Int64/1024-16               8.85ns ± 2%    7.35ns ± 2%   -16.92%  (p=0.000 n=10+9)
MapAccessHit/Int64/2048-16               11.2ns ± 3%     7.7ns ± 1%   -31.23%  (p=0.000 n=10+8)
MapAccessHit/Int64/4096-16               14.1ns ± 1%     7.9ns ± 1%   -43.96%  (p=0.000 n=7+8)
MapAccessHit/Int64/8192-16               16.2ns ± 2%     8.2ns ± 2%   -49.14%  (p=0.000 n=10+10)
MapAccessHit/Int64/65536-16              19.6ns ± 2%    10.5ns ± 1%   -46.18%  (p=0.000 n=10+9)
MapAccessHit/Int32/6-16                  3.78ns ± 1%    3.86ns ± 1%    +2.12%  (p=0.000 n=10+8)
MapAccessHit/Int32/12-16                 6.23ns ± 6%    6.16ns ± 4%      ~     (p=0.483 n=10+9)
MapAccessHit/Int32/18-16                 6.42ns ± 5%    6.99ns ± 3%    +8.91%  (p=0.000 n=10+9)
MapAccessHit/Int32/24-16                 7.46ns ± 5%    8.60ns ± 8%   +15.32%  (p=0.000 n=9+10)
MapAccessHit/Int32/30-16                 6.07ns ± 5%    6.97ns ± 1%   +14.88%  (p=0.000 n=10+8)
MapAccessHit/Int32/64-16                 6.50ns ± 4%    7.18ns ± 5%   +10.34%  (p=0.000 n=9+10)
MapAccessHit/Int32/128-16                6.68ns ± 6%    7.15ns ± 4%    +7.12%  (p=0.000 n=10+10)
MapAccessHit/Int32/256-16                6.81ns ± 4%    7.32ns ± 4%    +7.45%  (p=0.000 n=10+10)
MapAccessHit/Int32/512-16                7.40ns ± 3%    7.30ns ± 3%      ~     (p=0.156 n=9+10)
MapAccessHit/Int32/1024-16               8.46ns ± 2%    7.38ns ± 1%   -12.79%  (p=0.000 n=10+9)
MapAccessHit/Int32/2048-16               11.0ns ± 3%     7.6ns ± 2%   -31.46%  (p=0.000 n=10+10)
MapAccessHit/Int32/4096-16               13.9ns ± 2%     7.8ns ± 2%   -44.12%  (p=0.000 n=10+10)
MapAccessHit/Int32/8192-16               15.8ns ± 2%     8.1ns ± 1%   -48.99%  (p=0.000 n=10+10)
MapAccessHit/Int32/65536-16              19.0ns ± 2%    10.3ns ± 2%   -45.85%  (p=0.000 n=10+10)
MapAccessHit/Str/6-16                    13.5ns ± 1%    12.7ns ± 2%    -5.88%  (p=0.000 n=9+10)
MapAccessHit/Str/12-16                   9.77ns ±11%    9.40ns ± 2%      ~     (p=0.460 n=10+8)
MapAccessHit/Str/18-16                   9.05ns ± 7%    9.47ns ± 1%    +4.66%  (p=0.001 n=9+9)
MapAccessHit/Str/24-16                   9.92ns ± 7%   10.07ns ± 9%      ~     (p=0.604 n=9+10)
MapAccessHit/Str/30-16                   8.46ns ± 7%    9.43ns ± 1%   +11.50%  (p=0.000 n=10+8)
MapAccessHit/Str/64-16                   8.91ns ± 5%    9.57ns ± 2%    +7.39%  (p=0.000 n=10+8)
MapAccessHit/Str/128-16                  9.82ns ± 4%   10.58ns ± 5%    +7.75%  (p=0.000 n=10+10)
MapAccessHit/Str/256-16                  11.8ns ± 4%    11.4ns ± 1%    -3.01%  (p=0.008 n=10+8)
MapAccessHit/Str/512-16                  14.6ns ± 2%    11.9ns ± 2%   -18.89%  (p=0.000 n=8+9)
MapAccessHit/Str/1024-16                 17.9ns ± 2%    12.7ns ± 1%   -29.02%  (p=0.000 n=10+9)
MapAccessHit/Str/2048-16                 21.5ns ± 3%    13.0ns ± 2%   -39.43%  (p=0.000 n=10+9)
MapAccessHit/Str/4096-16                 25.1ns ± 1%    13.2ns ± 2%   -47.63%  (p=0.000 n=10+10)
MapAccessHit/Str/8192-16                 26.6ns ± 1%    14.2ns ± 1%   -46.62%  (p=0.000 n=9+9)
MapAccessHit/Str/65536-16                31.8ns ± 1%    17.3ns ± 2%   -45.64%  (p=0.000 n=10+10)
MapAccessMiss/Int64/6-16                 8.03ns ± 1%    7.35ns ± 1%    -8.39%  (p=0.000 n=10+10)
MapAccessMiss/Int64/12-16                10.2ns ± 2%    18.3ns ± 3%   +79.48%  (p=0.000 n=8+8)
MapAccessMiss/Int64/18-16                10.3ns ± 1%     7.2ns ± 1%   -29.85%  (p=0.000 n=9+8)
MapAccessMiss/Int64/24-16                13.9ns ± 2%    10.8ns ± 2%   -22.43%  (p=0.000 n=7+8)
MapAccessMiss/Int64/30-16                10.1ns ± 3%     7.1ns ± 3%   -29.69%  (p=0.000 n=8+8)
MapAccessMiss/Int64/64-16                10.3ns ± 1%     7.9ns ±12%   -23.29%  (p=0.000 n=7+10)
MapAccessMiss/Int64/128-16               10.2ns ± 2%     7.6ns ± 8%   -25.64%  (p=0.000 n=10+9)
MapAccessMiss/Int64/256-16               10.4ns ± 2%     7.9ns ± 7%   -23.40%  (p=0.000 n=9+9)
MapAccessMiss/Int64/512-16               10.3ns ± 3%     7.9ns ± 8%   -23.37%  (p=0.000 n=9+10)
MapAccessMiss/Int64/1024-16              10.4ns ± 2%     8.0ns ± 4%   -22.40%  (p=0.000 n=9+10)
MapAccessMiss/Int64/2048-16              10.4ns ± 2%     7.9ns ± 3%   -23.97%  (p=0.000 n=10+10)
MapAccessMiss/Int64/4096-16              10.4ns ± 2%     8.2ns ± 3%   -21.67%  (p=0.000 n=10+10)
MapAccessMiss/Int64/8192-16              10.3ns ± 2%     8.6ns ± 3%   -16.95%  (p=0.000 n=10+10)
MapAccessMiss/Int64/65536-16             13.5ns ± 2%    10.9ns ± 3%   -19.23%  (p=0.000 n=9+8)
MapAccessMiss/Int32/6-16                 6.17ns ± 2%    7.45ns ± 2%   +20.86%  (p=0.000 n=10+10)
MapAccessMiss/Int32/12-16                8.50ns ± 1%   15.94ns ± 3%   +87.44%  (p=0.000 n=8+8)
MapAccessMiss/Int32/18-16                8.49ns ± 2%    8.21ns ±30%      ~     (p=0.156 n=9+10)
MapAccessMiss/Int32/24-16                11.9ns ± 2%    10.8ns ± 2%    -9.03%  (p=0.000 n=8+7)
MapAccessMiss/Int32/30-16                8.48ns ± 1%    7.53ns ±15%      ~     (p=0.138 n=10+10)
MapAccessMiss/Int32/64-16                8.49ns ± 1%    8.11ns ±17%    -4.50%  (p=0.034 n=8+10)
MapAccessMiss/Int32/128-16               8.89ns ± 2%    7.86ns ±10%   -11.57%  (p=0.000 n=7+10)
MapAccessMiss/Int32/256-16               8.72ns ± 3%    7.83ns ± 3%   -10.23%  (p=0.000 n=10+9)
MapAccessMiss/Int32/512-16               8.79ns ± 4%    7.70ns ± 4%   -12.40%  (p=0.000 n=10+9)
MapAccessMiss/Int32/1024-16              8.81ns ± 1%    7.74ns ± 5%   -12.10%  (p=0.000 n=9+10)
MapAccessMiss/Int32/2048-16              9.16ns ± 1%    7.91ns ± 2%   -13.64%  (p=0.000 n=7+9)
MapAccessMiss/Int32/4096-16              9.40ns ± 2%    8.15ns ± 3%   -13.29%  (p=0.000 n=9+9)
MapAccessMiss/Int32/8192-16              9.47ns ± 2%    8.29ns ± 2%   -12.45%  (p=0.000 n=9+9)
MapAccessMiss/Int32/65536-16             12.9ns ± 2%    10.6ns ± 2%   -18.32%  (p=0.000 n=8+10)
MapAccessMiss/Str/6-16                   5.69ns ± 1%    6.89ns ± 1%   +21.05%  (p=0.000 n=10+9)
MapAccessMiss/Str/12-16                  11.7ns ± 5%    10.6ns ±11%    -9.74%  (p=0.001 n=10+10)
MapAccessMiss/Str/18-16                  10.2ns ± 1%     9.6ns ± 1%    -5.81%  (p=0.000 n=8+8)
MapAccessMiss/Str/24-16                  12.5ns ±11%    11.4ns ± 9%    -8.83%  (p=0.011 n=10+10)
MapAccessMiss/Str/30-16                  10.8ns ± 4%     8.9ns ± 1%   -17.66%  (p=0.000 n=10+8)
MapAccessMiss/Str/64-16                  10.8ns ± 4%     9.3ns ± 8%   -13.63%  (p=0.000 n=10+10)
MapAccessMiss/Str/128-16                 12.0ns ± 7%     9.9ns ±10%   -17.57%  (p=0.000 n=10+10)
MapAccessMiss/Str/256-16                 11.2ns ± 3%    10.0ns ± 5%   -11.09%  (p=0.000 n=10+10)
MapAccessMiss/Str/512-16                 11.1ns ± 3%     9.6ns ± 6%   -13.51%  (p=0.000 n=10+10)
MapAccessMiss/Str/1024-16                12.3ns ± 2%     9.7ns ± 3%   -20.85%  (p=0.000 n=10+10)
MapAccessMiss/Str/2048-16                15.7ns ± 2%    10.1ns ± 4%   -35.32%  (p=0.000 n=10+10)
MapAccessMiss/Str/4096-16                14.0ns ± 3%    10.2ns ± 3%   -27.20%  (p=0.000 n=10+10)
MapAccessMiss/Str/8192-16                14.1ns ± 2%    10.9ns ± 4%   -22.70%  (p=0.000 n=10+10)
MapAccessMiss/Str/65536-16               19.2ns ± 2%    13.6ns ± 4%   -29.47%  (p=0.000 n=10+10)
MapAssignGrow/Int64/6-16                 69.1ns ± 1%    69.5ns ± 1%      ~     (p=0.133 n=9+10)
MapAssignGrow/Int64/12-16                 759ns ± 0%     539ns ± 0%   -28.91%  (p=0.000 n=7+10)
MapAssignGrow/Int64/18-16                1.67µs ± 0%    1.19µs ± 1%   -28.56%  (p=0.000 n=10+10)
MapAssignGrow/Int64/24-16                2.02µs ± 0%    1.36µs ± 0%   -32.89%  (p=0.000 n=10+10)
MapAssignGrow/Int64/30-16                3.53µs ± 0%    2.53µs ± 0%   -28.19%  (p=0.000 n=8+10)
MapAssignGrow/Int64/64-16                7.84µs ± 1%    5.38µs ± 1%   -31.36%  (p=0.000 n=10+10)
MapAssignGrow/Int64/128-16               15.5µs ± 0%    10.9µs ± 0%   -29.52%  (p=0.000 n=9+10)
MapAssignGrow/Int64/256-16               30.2µs ± 0%    21.9µs ± 0%   -27.59%  (p=0.000 n=10+10)
MapAssignGrow/Int64/512-16               58.8µs ± 0%    43.7µs ± 0%   -25.58%  (p=0.000 n=10+9)
MapAssignGrow/Int64/1024-16               116µs ± 0%      88µs ± 0%   -24.24%  (p=0.000 n=10+9)
MapAssignGrow/Int64/2048-16               231µs ± 0%     175µs ± 0%   -24.04%  (p=0.000 n=10+10)
MapAssignGrow/Int64/4096-16               458µs ± 0%     351µs ± 0%   -23.49%  (p=0.000 n=10+10)
MapAssignGrow/Int64/8192-16               919µs ± 0%     712µs ± 0%   -22.51%  (p=0.000 n=10+10)
MapAssignGrow/Int64/65536-16             8.69ms ± 1%    6.29ms ± 0%   -27.66%  (p=0.000 n=10+7)
MapAssignGrow/Int32/6-16                 71.7ns ± 1%    67.6ns ± 1%    -5.72%  (p=0.000 n=9+10)
MapAssignGrow/Int32/12-16                 734ns ± 0%     521ns ± 0%   -29.00%  (p=0.000 n=9+10)
MapAssignGrow/Int32/18-16                1.61µs ± 1%    1.15µs ± 0%   -28.59%  (p=0.000 n=10+7)
MapAssignGrow/Int32/24-16                1.97µs ± 0%    1.32µs ± 0%   -33.10%  (p=0.000 n=10+9)
MapAssignGrow/Int32/30-16                3.41µs ± 0%    2.43µs ± 1%   -28.67%  (p=0.000 n=10+10)
MapAssignGrow/Int32/64-16                7.45µs ± 0%    5.13µs ± 0%   -31.09%  (p=0.000 n=10+10)
MapAssignGrow/Int32/128-16               15.0µs ± 0%    10.7µs ± 0%   -28.89%  (p=0.000 n=10+9)
MapAssignGrow/Int32/256-16               29.8µs ± 0%    22.0µs ± 1%   -26.05%  (p=0.000 n=9+10)
MapAssignGrow/Int32/512-16               58.1µs ± 0%    42.9µs ± 0%   -26.07%  (p=0.000 n=10+8)
MapAssignGrow/Int32/1024-16               115µs ± 0%      86µs ± 0%   -24.96%  (p=0.000 n=10+10)
MapAssignGrow/Int32/2048-16               226µs ± 1%     171µs ± 1%   -24.44%  (p=0.000 n=10+10)
MapAssignGrow/Int32/4096-16               445µs ± 1%     341µs ± 0%   -23.31%  (p=0.000 n=10+10)
MapAssignGrow/Int32/8192-16               900µs ± 0%     686µs ± 0%   -23.72%  (p=0.000 n=10+10)
MapAssignGrow/Int32/65536-16             7.96ms ± 0%    6.11ms ± 1%   -23.18%  (p=0.000 n=7+10)
MapAssignGrow/Str/6-16                   86.5ns ± 2%    91.6ns ± 2%    +5.88%  (p=0.000 n=10+10)
MapAssignGrow/Str/12-16                   908ns ± 0%     719ns ± 0%   -20.87%  (p=0.000 n=10+10)
MapAssignGrow/Str/18-16                  2.01µs ± 0%    1.59µs ± 0%   -20.98%  (p=0.000 n=7+8)
MapAssignGrow/Str/24-16                  2.36µs ± 0%    1.79µs ± 1%   -23.93%  (p=0.000 n=10+10)
MapAssignGrow/Str/30-16                  4.17µs ± 0%    3.22µs ± 0%   -22.72%  (p=0.000 n=10+10)
MapAssignGrow/Str/64-16                  9.21µs ± 0%    6.73µs ± 0%   -26.96%  (p=0.000 n=7+9)
MapAssignGrow/Str/128-16                 18.6µs ± 0%    13.4µs ± 1%   -27.60%  (p=0.000 n=8+10)
MapAssignGrow/Str/256-16                 35.5µs ± 0%    26.8µs ± 0%   -24.53%  (p=0.000 n=10+10)
MapAssignGrow/Str/512-16                 70.6µs ± 0%    53.3µs ± 0%   -24.58%  (p=0.000 n=10+10)
MapAssignGrow/Str/1024-16                 142µs ± 1%     109µs ± 0%   -23.46%  (p=0.000 n=9+10)
MapAssignGrow/Str/2048-16                 289µs ± 1%     221µs ± 0%   -23.54%  (p=0.000 n=10+9)
MapAssignGrow/Str/4096-16                 588µs ± 0%     448µs ± 0%   -23.83%  (p=0.000 n=9+9)
MapAssignGrow/Str/8192-16                1.27ms ± 1%    0.91ms ± 0%   -28.82%  (p=0.000 n=10+10)
MapAssignGrow/Str/65536-16               12.4ms ± 1%     9.9ms ± 1%   -20.47%  (p=0.000 n=10+9)
MapAssignPreAllocate/Pointer/6-16         310ns ± 1%     281ns ± 0%    -9.41%  (p=0.000 n=10+7)
MapAssignPreAllocate/Pointer/12-16        864ns ± 0%     668ns ± 1%   -22.73%  (p=0.000 n=10+10)
MapAssignPreAllocate/Pointer/18-16       1.31µs ± 0%    0.97µs ± 0%   -25.94%  (p=0.000 n=10+10)
MapAssignPreAllocate/Pointer/24-16       1.77µs ± 0%    1.26µs ± 0%   -29.07%  (p=0.000 n=10+9)
MapAssignPreAllocate/Pointer/30-16       2.16µs ± 0%    1.60µs ± 1%   -26.13%  (p=0.000 n=10+9)
MapAssignPreAllocate/Pointer/64-16       4.73µs ± 1%    3.23µs ± 0%   -31.72%  (p=0.000 n=10+10)
MapAssignPreAllocate/Pointer/128-16      9.18µs ± 0%    6.36µs ± 1%   -30.65%  (p=0.000 n=10+10)
MapAssignPreAllocate/Pointer/256-16      18.0µs ± 0%    12.4µs ± 0%   -30.98%  (p=0.000 n=8+10)
MapAssignPreAllocate/Pointer/512-16      36.2µs ± 1%    24.6µs ± 0%   -32.11%  (p=0.000 n=10+8)
MapAssignPreAllocate/Pointer/1024-16     72.4µs ± 1%    50.3µs ± 0%   -30.49%  (p=0.000 n=10+10)
MapAssignPreAllocate/Pointer/2048-16      145µs ± 1%     102µs ± 0%   -29.93%  (p=0.000 n=10+10)
MapAssignPreAllocate/Pointer/4096-16      291µs ± 0%     209µs ± 1%   -28.18%  (p=0.000 n=10+9)
MapAssignPreAllocate/Pointer/8192-16      590µs ± 0%     444µs ± 1%   -24.76%  (p=0.000 n=10+10)
MapAssignPreAllocate/Pointer/65536-16    6.21ms ± 1%    5.68ms ± 1%    -8.48%  (p=0.000 n=9+9)
MapAssignPreAllocate/Int64/6-16          74.7ns ± 2%    71.2ns ± 2%    -4.68%  (p=0.000 n=10+10)
MapAssignPreAllocate/Int64/12-16          540ns ± 0%     360ns ± 0%   -33.39%  (p=0.000 n=9+9)
MapAssignPreAllocate/Int64/18-16          811ns ± 0%     525ns ± 0%   -35.20%  (p=0.000 n=9+9)
MapAssignPreAllocate/Int64/24-16         1.16µs ± 0%    0.68µs ± 1%   -41.94%  (p=0.000 n=9+10)
MapAssignPreAllocate/Int64/30-16         1.33µs ± 1%    0.87µs ± 1%   -34.60%  (p=0.000 n=10+10)
MapAssignPreAllocate/Int64/64-16         2.97µs ± 1%    1.75µs ± 0%   -41.01%  (p=0.000 n=10+10)
MapAssignPreAllocate/Int64/128-16        5.73µs ± 0%    3.39µs ± 0%   -40.79%  (p=0.000 n=9+8)
MapAssignPreAllocate/Int64/256-16        11.0µs ± 0%     6.5µs ± 0%   -40.50%  (p=0.000 n=10+8)
MapAssignPreAllocate/Int64/512-16        21.8µs ± 0%    12.9µs ± 0%   -40.91%  (p=0.000 n=10+10)
MapAssignPreAllocate/Int64/1024-16       43.6µs ± 0%    26.4µs ± 0%   -39.42%  (p=0.000 n=10+10)
MapAssignPreAllocate/Int64/2048-16       88.0µs ± 1%    52.5µs ± 0%   -40.40%  (p=0.000 n=10+8)
MapAssignPreAllocate/Int64/4096-16        175µs ± 0%     108µs ± 0%   -38.60%  (p=0.000 n=9+10)
MapAssignPreAllocate/Int64/8192-16        362µs ± 0%     224µs ± 1%   -38.10%  (p=0.000 n=8+10)
MapAssignPreAllocate/Int64/65536-16      3.78ms ± 0%    3.21ms ± 2%   -15.14%  (p=0.000 n=10+10)
MapAssignPreAllocate/Int32/6-16          72.8ns ± 1%    69.2ns ± 1%    -4.98%  (p=0.000 n=9+10)
MapAssignPreAllocate/Int32/12-16          503ns ± 0%     342ns ± 0%   -32.02%  (p=0.000 n=10+9)
MapAssignPreAllocate/Int32/18-16          770ns ± 1%     498ns ± 1%   -35.29%  (p=0.000 n=10+8)
MapAssignPreAllocate/Int32/24-16         1.11µs ± 1%    0.65µs ± 0%   -41.79%  (p=0.000 n=10+8)
MapAssignPreAllocate/Int32/30-16         1.26µs ± 0%    0.81µs ± 1%   -35.71%  (p=0.000 n=10+8)
MapAssignPreAllocate/Int32/64-16         2.79µs ± 1%    1.63µs ± 0%   -41.60%  (p=0.000 n=10+9)
MapAssignPreAllocate/Int32/128-16        5.60µs ± 1%    3.39µs ± 1%   -39.52%  (p=0.000 n=10+10)
MapAssignPreAllocate/Int32/256-16        11.1µs ± 1%     6.7µs ± 1%   -39.66%  (p=0.000 n=10+10)
MapAssignPreAllocate/Int32/512-16        21.6µs ± 0%    12.2µs ± 0%   -43.30%  (p=0.000 n=10+10)
MapAssignPreAllocate/Int32/1024-16       42.4µs ± 1%    24.2µs ± 0%   -42.91%  (p=0.000 n=10+10)
MapAssignPreAllocate/Int32/2048-16       84.9µs ± 0%    50.0µs ± 0%   -41.08%  (p=0.000 n=10+8)
MapAssignPreAllocate/Int32/4096-16        173µs ± 0%     104µs ± 0%   -40.04%  (p=0.000 n=10+10)
MapAssignPreAllocate/Int32/8192-16        347µs ± 1%     212µs ± 1%   -39.07%  (p=0.000 n=10+8)
MapAssignPreAllocate/Int32/65536-16      3.69ms ± 1%    3.07ms ± 2%   -16.96%  (p=0.000 n=10+10)
MapAssignPreAllocate/Str/6-16            89.6ns ± 2%    94.6ns ± 1%    +5.49%  (p=0.000 n=9+7)
MapAssignPreAllocate/Str/12-16            641ns ± 1%     504ns ± 0%   -21.37%  (p=0.000 n=9+9)
MapAssignPreAllocate/Str/18-16           1.01µs ± 0%    0.76µs ± 0%   -24.98%  (p=0.000 n=7+8)
MapAssignPreAllocate/Str/24-16           1.36µs ± 0%    0.96µs ± 0%   -29.74%  (p=0.000 n=9+9)
MapAssignPreAllocate/Str/30-16           1.68µs ± 0%    1.22µs ± 0%   -27.15%  (p=0.000 n=10+9)
MapAssignPreAllocate/Str/64-16           3.82µs ± 0%    2.43µs ± 0%   -36.29%  (p=0.000 n=10+10)
MapAssignPreAllocate/Str/128-16          7.60µs ± 0%    4.66µs ± 0%   -38.67%  (p=0.000 n=9+10)
MapAssignPreAllocate/Str/256-16          13.8µs ± 0%     9.2µs ± 0%   -33.55%  (p=0.000 n=10+10)
MapAssignPreAllocate/Str/512-16          27.5µs ± 0%    18.2µs ± 0%   -33.89%  (p=0.000 n=10+9)
MapAssignPreAllocate/Str/1024-16         55.4µs ± 0%    37.8µs ± 0%   -31.90%  (p=0.000 n=10+10)
MapAssignPreAllocate/Str/2048-16          111µs ± 0%      77µs ± 0%   -30.20%  (p=0.000 n=9+9)
MapAssignPreAllocate/Str/4096-16          226µs ± 0%     159µs ± 0%   -29.57%  (p=0.000 n=10+9)
MapAssignPreAllocate/Str/8192-16          481µs ± 0%     368µs ± 1%   -23.34%  (p=0.000 n=9+10)
MapAssignPreAllocate/Str/65536-16        4.83ms ± 1%    4.11ms ± 1%   -14.86%  (p=0.000 n=10+10)
MapAssignReuse/Pointer/6-16               330ns ± 2%     290ns ± 1%   -12.18%  (p=0.000 n=10+10)
MapAssignReuse/Pointer/12-16              757ns ± 1%     550ns ± 1%   -27.35%  (p=0.000 n=9+9)
MapAssignReuse/Pointer/18-16             1.16µs ± 1%    0.81µs ± 1%   -30.13%  (p=0.000 n=9+10)
MapAssignReuse/Pointer/24-16             1.61µs ± 1%    1.08µs ± 1%   -32.59%  (p=0.000 n=8+10)
MapAssignReuse/Pointer/30-16             1.91µs ± 2%    1.31µs ± 1%   -31.72%  (p=0.000 n=10+9)
MapAssignReuse/Pointer/64-16             4.12µs ± 1%    2.75µs ± 1%   -33.26%  (p=0.000 n=8+9)
MapAssignReuse/Pointer/128-16            8.22µs ± 2%    5.50µs ± 1%   -33.03%  (p=0.000 n=10+10)
MapAssignReuse/Pointer/256-16            16.4µs ± 1%    11.0µs ± 1%   -33.01%  (p=0.000 n=9+10)
MapAssignReuse/Pointer/512-16            33.1µs ± 2%    21.9µs ± 1%   -33.72%  (p=0.000 n=10+10)
MapAssignReuse/Pointer/1024-16           66.7µs ± 2%    44.8µs ± 1%   -32.78%  (p=0.000 n=10+9)
MapAssignReuse/Pointer/2048-16            132µs ± 2%      92µs ± 1%   -30.11%  (p=0.000 n=10+10)
MapAssignReuse/Pointer/4096-16            268µs ± 1%     187µs ± 1%   -30.25%  (p=0.000 n=9+10)
MapAssignReuse/Pointer/8192-16            546µs ± 4%     389µs ± 1%   -28.67%  (p=0.000 n=10+10)
MapAssignReuse/Pointer/65536-16          5.14ms ± 3%    4.18ms ± 1%   -18.60%  (p=0.000 n=10+10)
MapAssignReuse/Int64/6-16                81.1ns ± 1%    74.8ns ± 2%    -7.75%  (p=0.000 n=10+10)
MapAssignReuse/Int64/12-16                413ns ± 3%     152ns ± 1%   -63.04%  (p=0.000 n=9+10)
MapAssignReuse/Int64/18-16                429ns ± 3%     223ns ± 1%   -48.00%  (p=0.000 n=8+10)
MapAssignReuse/Int64/24-16               1.01µs ± 4%    0.30µs ± 1%   -69.93%  (p=0.000 n=10+9)
MapAssignReuse/Int64/30-16                618ns ± 3%     358ns ± 2%   -42.00%  (p=0.000 n=9+10)
MapAssignReuse/Int64/64-16               1.31µs ± 1%    0.75µs ± 2%   -42.74%  (p=0.000 n=8+8)
MapAssignReuse/Int64/128-16              2.64µs ± 3%    1.51µs ± 2%   -42.96%  (p=0.000 n=9+10)
MapAssignReuse/Int64/256-16              5.23µs ± 4%    3.00µs ± 2%   -42.59%  (p=0.000 n=10+10)
MapAssignReuse/Int64/512-16              10.3µs ± 3%     6.0µs ± 1%   -41.70%  (p=0.000 n=10+8)
MapAssignReuse/Int64/1024-16             21.0µs ± 2%    12.1µs ± 2%   -42.09%  (p=0.000 n=10+10)
MapAssignReuse/Int64/2048-16             42.2µs ± 2%    25.5µs ± 2%   -39.56%  (p=0.000 n=10+10)
MapAssignReuse/Int64/4096-16             85.3µs ± 3%    51.3µs ± 2%   -39.88%  (p=0.000 n=10+10)
MapAssignReuse/Int64/8192-16              176µs ± 3%     107µs ± 2%   -39.54%  (p=0.000 n=10+10)
MapAssignReuse/Int64/65536-16            1.73ms ± 3%    1.16ms ± 2%   -33.33%  (p=0.000 n=10+10)
MapAssignReuse/Int32/6-16                79.6ns ± 1%    72.4ns ± 2%    -9.14%  (p=0.000 n=10+10)
MapAssignReuse/Int32/12-16                356ns ± 7%     150ns ± 1%   -57.73%  (p=0.000 n=9+10)
MapAssignReuse/Int32/18-16                394ns ± 5%     217ns ± 2%   -44.82%  (p=0.000 n=9+9)
MapAssignReuse/Int32/24-16               1.01µs ± 7%    0.29µs ± 2%   -70.98%  (p=0.000 n=10+10)
MapAssignReuse/Int32/30-16                618ns ± 5%     348ns ± 2%   -43.68%  (p=0.000 n=10+10)
MapAssignReuse/Int32/64-16               1.29µs ± 4%    0.73µs ± 2%   -43.23%  (p=0.000 n=10+10)
MapAssignReuse/Int32/128-16              2.61µs ± 3%    1.46µs ± 2%   -43.88%  (p=0.000 n=10+10)
MapAssignReuse/Int32/256-16              5.21µs ± 3%    2.92µs ± 2%   -43.90%  (p=0.000 n=10+10)
MapAssignReuse/Int32/512-16              10.2µs ± 3%     5.9µs ± 1%   -42.54%  (p=0.000 n=10+9)
MapAssignReuse/Int32/1024-16             20.5µs ± 3%    11.8µs ± 1%   -42.72%  (p=0.000 n=10+9)
MapAssignReuse/Int32/2048-16             41.7µs ± 3%    24.8µs ± 2%   -40.50%  (p=0.000 n=9+10)
MapAssignReuse/Int32/4096-16             84.5µs ± 2%    50.8µs ± 1%   -39.93%  (p=0.000 n=10+9)
MapAssignReuse/Int32/8192-16              170µs ± 1%     103µs ± 2%   -39.52%  (p=0.000 n=10+8)
MapAssignReuse/Int32/65536-16            1.68ms ± 3%    1.12ms ± 2%   -33.25%  (p=0.000 n=10+10)
MapAssignReuse/Str/6-16                  96.8ns ± 3%   102.0ns ± 1%    +5.33%  (p=0.000 n=10+10)
MapAssignReuse/Str/12-16                  491ns ± 3%     202ns ± 1%   -58.99%  (p=0.000 n=8+9)
MapAssignReuse/Str/18-16                  500ns ± 4%     292ns ± 2%   -41.68%  (p=0.000 n=10+10)
MapAssignReuse/Str/24-16                 1.13µs ± 3%    0.40µs ± 1%   -64.33%  (p=0.000 n=9+10)
MapAssignReuse/Str/30-16                  783ns ± 5%     480ns ± 2%   -38.77%  (p=0.000 n=10+10)
MapAssignReuse/Str/64-16                 1.53µs ± 2%    1.02µs ± 2%   -33.00%  (p=0.000 n=10+10)
MapAssignReuse/Str/128-16                3.06µs ± 1%    2.04µs ± 2%   -33.22%  (p=0.000 n=10+10)
MapAssignReuse/Str/256-16                6.15µs ± 3%    4.08µs ± 2%   -33.59%  (p=0.000 n=9+10)
MapAssignReuse/Str/512-16                12.3µs ± 3%     8.2µs ± 1%   -33.49%  (p=0.000 n=10+10)
MapAssignReuse/Str/1024-16               25.3µs ± 2%    17.1µs ± 2%   -32.55%  (p=0.000 n=10+10)
MapAssignReuse/Str/2048-16               50.7µs ± 3%    34.6µs ± 2%   -31.79%  (p=0.000 n=10+10)
MapAssignReuse/Str/4096-16                103µs ± 2%      70µs ± 2%   -31.98%  (p=0.000 n=10+10)
MapAssignReuse/Str/8192-16                218µs ± 1%     157µs ± 2%   -28.32%  (p=0.000 n=9+10)
MapAssignReuse/Str/65536-16              2.03ms ± 1%    1.64ms ± 2%   -19.62%  (p=0.000 n=10+9)

name old alloc/op new alloc/op delta
MapIter/Int/6-16 0.00B 0.00B ~ (all equal)
MapIter/Int/12-16 0.00B 0.00B ~ (all equal)
MapIter/Int/18-16 0.00B 0.00B ~ (all equal)
MapIter/Int/24-16 0.00B 0.00B ~ (all equal)
MapIter/Int/30-16 0.00B 0.00B ~ (all equal)
MapIter/Int/64-16 0.00B 0.00B ~ (all equal)
MapIter/Int/128-16 0.00B 0.00B ~ (all equal)
MapIter/Int/256-16 0.00B 0.00B ~ (all equal)
MapIter/Int/512-16 0.00B 0.00B ~ (all equal)
MapIter/Int/1024-16 0.00B 0.00B ~ (all equal)
MapIter/Int/2048-16 0.00B 0.00B ~ (all equal)
MapIter/Int/4096-16 0.00B 0.00B ~ (all equal)
MapIter/Int/8192-16 0.00B 0.00B ~ (all equal)
MapIter/Int/65536-16 0.00B 0.00B ~ (all equal)
MapAccessHit/Int64/6-16 0.00B 0.00B ~ (all equal)
MapAccessHit/Int64/12-16 0.00B 0.00B ~ (all equal)
MapAccessHit/Int64/18-16 0.00B 0.00B ~ (all equal)
MapAccessHit/Int64/24-16 0.00B 0.00B ~ (all equal)
MapAccessHit/Int64/30-16 0.00B 0.00B ~ (all equal)
MapAccessHit/Int64/64-16 0.00B 0.00B ~ (all equal)
MapAccessHit/Int64/128-16 0.00B 0.00B ~ (all equal)
MapAccessHit/Int64/256-16 0.00B 0.00B ~ (all equal)
MapAccessHit/Int64/512-16 0.00B 0.00B ~ (all equal)
MapAccessHit/Int64/1024-16 0.00B 0.00B ~ (all equal)
MapAccessHit/Int64/2048-16 0.00B 0.00B ~ (all equal)
MapAccessHit/Int64/4096-16 0.00B 0.00B ~ (all equal)
MapAccessHit/Int64/8192-16 0.00B 0.00B ~ (all equal)
MapAccessHit/Int64/65536-16 0.00B 0.00B ~ (all equal)
MapAccessHit/Int32/6-16 0.00B 0.00B ~ (all equal)
MapAccessHit/Int32/12-16 0.00B 0.00B ~ (all equal)
MapAccessHit/Int32/18-16 0.00B 0.00B ~ (all equal)
MapAccessHit/Int32/24-16 0.00B 0.00B ~ (all equal)
MapAccessHit/Int32/30-16 0.00B 0.00B ~ (all equal)
MapAccessHit/Int32/64-16 0.00B 0.00B ~ (all equal)
MapAccessHit/Int32/128-16 0.00B 0.00B ~ (all equal)
MapAccessHit/Int32/256-16 0.00B 0.00B ~ (all equal)
MapAccessHit/Int32/512-16 0.00B 0.00B ~ (all equal)
MapAccessHit/Int32/1024-16 0.00B 0.00B ~ (all equal)
MapAccessHit/Int32/2048-16 0.00B 0.00B ~ (all equal)
MapAccessHit/Int32/4096-16 0.00B 0.00B ~ (all equal)
MapAccessHit/Int32/8192-16 0.00B 0.00B ~ (all equal)
MapAccessHit/Int32/65536-16 0.00B 0.00B ~ (all equal)
MapAccessHit/Str/6-16 0.00B 0.00B ~ (all equal)
MapAccessHit/Str/12-16 0.00B 0.00B ~ (all equal)
MapAccessHit/Str/18-16 0.00B 0.00B ~ (all equal)
MapAccessHit/Str/24-16 0.00B 0.00B ~ (all equal)
MapAccessHit/Str/30-16 0.00B 0.00B ~ (all equal)
MapAccessHit/Str/64-16 0.00B 0.00B ~ (all equal)
MapAccessHit/Str/128-16 0.00B 0.00B ~ (all equal)
MapAccessHit/Str/256-16 0.00B 0.00B ~ (all equal)
MapAccessHit/Str/512-16 0.00B 0.00B ~ (all equal)
MapAccessHit/Str/1024-16 0.00B 0.00B ~ (all equal)
MapAccessHit/Str/2048-16 0.00B 0.00B ~ (all equal)
MapAccessHit/Str/4096-16 0.00B 0.00B ~ (all equal)
MapAccessHit/Str/8192-16 0.00B 0.00B ~ (all equal)
MapAccessHit/Str/65536-16 0.00B 0.00B ~ (all equal)
MapAccessMiss/Int64/6-16 0.00B 0.00B ~ (all equal)
MapAccessMiss/Int64/12-16 0.00B 0.00B ~ (all equal)
MapAccessMiss/Int64/18-16 0.00B 0.00B ~ (all equal)
MapAccessMiss/Int64/24-16 0.00B 0.00B ~ (all equal)
MapAccessMiss/Int64/30-16 0.00B 0.00B ~ (all equal)
MapAccessMiss/Int64/64-16 0.00B 0.00B ~ (all equal)
MapAccessMiss/Int64/128-16 0.00B 0.00B ~ (all equal)
MapAccessMiss/Int64/256-16 0.00B 0.00B ~ (all equal)
MapAccessMiss/Int64/512-16 0.00B 0.00B ~ (all equal)
MapAccessMiss/Int64/1024-16 0.00B 0.00B ~ (all equal)
MapAccessMiss/Int64/2048-16 0.00B 0.00B ~ (all equal)
MapAccessMiss/Int64/4096-16 0.00B 0.00B ~ (all equal)
MapAccessMiss/Int64/8192-16 0.00B 0.00B ~ (all equal)
MapAccessMiss/Int64/65536-16 0.00B 0.00B ~ (all equal)
MapAccessMiss/Int32/6-16 0.00B 0.00B ~ (all equal)
MapAccessMiss/Int32/12-16 0.00B 0.00B ~ (all equal)
MapAccessMiss/Int32/18-16 0.00B 0.00B ~ (all equal)
MapAccessMiss/Int32/24-16 0.00B 0.00B ~ (all equal)
MapAccessMiss/Int32/30-16 0.00B 0.00B ~ (all equal)
MapAccessMiss/Int32/64-16 0.00B 0.00B ~ (all equal)
MapAccessMiss/Int32/128-16 0.00B 0.00B ~ (all equal)
MapAccessMiss/Int32/256-16 0.00B 0.00B ~ (all equal)
MapAccessMiss/Int32/512-16 0.00B 0.00B ~ (all equal)
MapAccessMiss/Int32/1024-16 0.00B 0.00B ~ (all equal)
MapAccessMiss/Int32/2048-16 0.00B 0.00B ~ (all equal)
MapAccessMiss/Int32/4096-16 0.00B 0.00B ~ (all equal)
MapAccessMiss/Int32/8192-16 0.00B 0.00B ~ (all equal)
MapAccessMiss/Int32/65536-16 0.00B 0.00B ~ (all equal)
MapAccessMiss/Str/6-16 0.00B 0.00B ~ (all equal)
MapAccessMiss/Str/12-16 0.00B 0.00B ~ (all equal)
MapAccessMiss/Str/18-16 0.00B 0.00B ~ (all equal)
MapAccessMiss/Str/24-16 0.00B 0.00B ~ (all equal)
MapAccessMiss/Str/30-16 0.00B 0.00B ~ (all equal)
MapAccessMiss/Str/64-16 0.00B 0.00B ~ (all equal)
MapAccessMiss/Str/128-16 0.00B 0.00B ~ (all equal)
MapAccessMiss/Str/256-16 0.00B 0.00B ~ (all equal)
MapAccessMiss/Str/512-16 0.00B 0.00B ~ (all equal)
MapAccessMiss/Str/1024-16 0.00B 0.00B ~ (all equal)
MapAccessMiss/Str/2048-16 0.00B 0.00B ~ (all equal)
MapAccessMiss/Str/4096-16 0.00B 0.00B ~ (all equal)
MapAccessMiss/Str/8192-16 0.00B 0.00B ~ (all equal)
MapAccessMiss/Str/65536-16 0.00B 0.00B ~ (all equal)
MapAssignGrow/Int64/6-16 0.00B 0.00B ~ (all equal)
MapAssignGrow/Int64/12-16 317B ± 0% 288B ± 0% -9.15% (p=0.000 n=10+10)
MapAssignGrow/Int64/18-16 931B ± 0% 864B ± 0% -7.20% (p=0.000 n=10+10)
MapAssignGrow/Int64/24-16 1.01kB ± 0% 0.86kB ± 0% -14.37% (p=0.000 n=9+10)
MapAssignGrow/Int64/30-16 2.22kB ± 0% 2.02kB ± 0% -9.13% (p=0.000 n=10+10)
MapAssignGrow/Int64/64-16 5.18kB ± 0% 4.32kB ± 0% -16.55% (p=0.000 n=10+10)
MapAssignGrow/Int64/128-16 10.8kB ± 0% 9.2kB ± 0% -15.18% (p=0.000 n=10+10)
MapAssignGrow/Int64/256-16 21.5kB ± 0% 18.7kB ± 0% -13.15% (p=0.000 n=10+10)
MapAssignGrow/Int64/512-16 43.2kB ± 0% 37.1kB ± 0% -14.11% (p=0.000 n=10+10)
MapAssignGrow/Int64/1024-16 86.6kB ± 0% 78.0kB ± 0% -9.84% (p=0.000 n=10+10)
MapAssignGrow/Int64/2048-16 173kB ± 0% 152kB ± 0% -12.43% (p=0.000 n=10+10)
MapAssignGrow/Int64/4096-16 347kB ± 0% 299kB ± 0% -13.72% (p=0.000 n=10+8)
MapAssignGrow/Int64/8192-16 685kB ± 0% 594kB ± 0% -13.32% (p=0.000 n=10+8)
MapAssignGrow/Int64/65536-16 5.45MB ± 0% 4.72MB ± 0% -13.26% (p=0.000 n=10+10)
MapAssignGrow/Int32/6-16 0.00B 0.00B ~ (all equal)
MapAssignGrow/Int32/12-16 248B ± 0% 224B ± 0% -9.68% (p=0.000 n=10+10)
MapAssignGrow/Int32/18-16 728B ± 0% 672B ± 0% -7.69% (p=0.000 n=10+10)
MapAssignGrow/Int32/24-16 793B ± 0% 672B ± 0% -15.26% (p=0.000 n=10+10)
MapAssignGrow/Int32/30-16 1.74kB ± 0% 1.57kB ± 0% -9.70% (p=0.000 n=10+10)
MapAssignGrow/Int32/64-16 4.01kB ± 0% 3.36kB ± 0% -16.15% (p=0.000 n=9+10)
MapAssignGrow/Int32/128-16 8.34kB ± 0% 7.46kB ± 0% -10.56% (p=0.000 n=10+10)
MapAssignGrow/Int32/256-16 17.0kB ± 0% 15.6kB ± 0% -7.90% (p=0.000 n=10+10)
MapAssignGrow/Int32/512-16 34.2kB ± 0% 30.0kB ± 0% -12.26% (p=0.000 n=10+10)
MapAssignGrow/Int32/1024-16 68.5kB ± 0% 58.7kB ± 0% -14.39% (p=0.000 n=10+10)
MapAssignGrow/Int32/2048-16 137kB ± 0% 116kB ± 0% -15.43% (p=0.000 n=10+10)
MapAssignGrow/Int32/4096-16 266kB ± 0% 231kB ± 0% -13.33% (p=0.000 n=10+10)
MapAssignGrow/Int32/8192-16 532kB ± 0% 460kB ± 0% -13.57% (p=0.000 n=10+10)
MapAssignGrow/Int32/65536-16 4.25MB ± 0% 3.67MB ± 0% -13.70% (p=0.000 n=10+8)
MapAssignGrow/Str/6-16 0.00B 0.00B ~ (all equal)
MapAssignGrow/Str/12-16 446B ± 0% 416B ± 0% -6.73% (p=0.000 n=10+10)
MapAssignGrow/Str/18-16 1.38kB ± 0% 1.31kB ± 0% -5.13% (p=0.000 n=10+10)
MapAssignGrow/Str/24-16 1.47kB ± 0% 1.31kB ± 0% -10.63% (p=0.000 n=10+10)
MapAssignGrow/Str/30-16 3.32kB ± 0% 3.10kB ± 0% -6.62% (p=0.000 n=10+10)
MapAssignGrow/Str/64-16 7.76kB ± 0% 6.56kB ± 0% -15.42% (p=0.000 n=10+10)
MapAssignGrow/Str/128-16 16.1kB ± 0% 13.3kB ± 0% -16.91% (p=0.000 n=10+10)
MapAssignGrow/Str/256-16 30.5kB ± 0% 26.9kB ± 0% -11.71% (p=0.000 n=10+10)
MapAssignGrow/Str/512-16 61.1kB ± 0% 54.2kB ± 0% -11.30% (p=0.000 n=10+10)
MapAssignGrow/Str/1024-16 122kB ± 0% 112kB ± 0% -8.66% (p=0.000 n=10+10)
MapAssignGrow/Str/2048-16 244kB ± 0% 218kB ± 0% -10.63% (p=0.000 n=10+10)
MapAssignGrow/Str/4096-16 487kB ± 0% 431kB ± 0% -11.58% (p=0.000 n=10+10)
MapAssignGrow/Str/8192-16 974kB ± 0% 857kB ± 0% -12.05% (p=0.000 n=10+9)
MapAssignGrow/Str/65536-16 7.74MB ± 0% 6.82MB ± 0% -11.89% (p=0.000 n=10+10)
MapAssignPreAllocate/Pointer/6-16 48.0B ± 0% 48.0B ± 0% ~ (all equal)
MapAssignPreAllocate/Pointer/12-16 405B ± 0% 384B ± 0% -5.09% (p=0.000 n=10+10)
MapAssignPreAllocate/Pointer/18-16 731B ± 0% 720B ± 0% -1.50% (p=0.000 n=10+10)
MapAssignPreAllocate/Pointer/24-16 837B ± 0% 768B ± 0% -8.24% (p=0.000 n=9+10)
MapAssignPreAllocate/Pointer/30-16 1.40kB ± 0% 1.39kB ± 0% -0.71% (p=0.000 n=10+10)
MapAssignPreAllocate/Pointer/64-16 3.22kB ± 0% 2.82kB ± 0% -12.66% (p=0.000 n=10+10)
MapAssignPreAllocate/Pointer/128-16 6.42kB ± 0% 5.89kB ± 0% -8.34% (p=0.000 n=10+10)
MapAssignPreAllocate/Pointer/256-16 12.3kB ± 0% 11.5kB ± 0% -6.43% (p=0.000 n=10+10)
MapAssignPreAllocate/Pointer/512-16 24.6kB ± 0% 22.5kB ± 0% -8.42% (p=0.000 n=10+10)
MapAssignPreAllocate/Pointer/1024-16 49.2kB ± 0% 49.2kB ± 0% -0.05% (p=0.000 n=10+10)
MapAssignPreAllocate/Pointer/2048-16 98.3kB ± 0% 90.1kB ± 0% -8.36% (p=0.000 n=10+10)
MapAssignPreAllocate/Pointer/4096-16 197kB ± 0% 180kB ± 0% -8.34% (p=0.000 n=9+10)
MapAssignPreAllocate/Pointer/8192-16 385kB ± 0% 360kB ± 0% -6.39% (p=0.000 n=10+8)
MapAssignPreAllocate/Pointer/65536-16 3.03MB ± 0% 2.88MB ± 0% -4.87% (p=0.000 n=10+10)
MapAssignPreAllocate/Int64/6-16 0.00B 0.00B ~ (all equal)
MapAssignPreAllocate/Int64/12-16 317B ± 0% 288B ± 0% -9.15% (p=0.000 n=10+10)
MapAssignPreAllocate/Int64/18-16 591B ± 0% 576B ± 0% -2.54% (p=0.000 n=10+10)
MapAssignPreAllocate/Int64/24-16 672B ± 0% 576B ± 0% -14.29% (p=0.000 n=10+10)
MapAssignPreAllocate/Int64/30-16 1.17kB ± 0% 1.15kB ± 0% -1.20% (p=0.000 n=10+10)
MapAssignPreAllocate/Int64/64-16 2.72kB ± 0% 2.30kB ± 0% -15.29% (p=0.000 n=10+10)
MapAssignPreAllocate/Int64/128-16 5.42kB ± 0% 4.86kB ± 0% -10.23% (p=0.000 n=10+10)
MapAssignPreAllocate/Int64/256-16 10.3kB ± 0% 9.5kB ± 0% -8.03% (p=0.000 n=10+10)
MapAssignPreAllocate/Int64/512-16 20.6kB ± 0% 18.4kB ± 0% -10.39% (p=0.000 n=10+10)
MapAssignPreAllocate/Int64/1024-16 41.1kB ± 0% 41.0kB ± 0% -0.37% (p=0.000 n=10+10)
MapAssignPreAllocate/Int64/2048-16 82.2kB ± 0% 73.7kB ± 0% -10.30% (p=0.000 n=10+10)
MapAssignPreAllocate/Int64/4096-16 164kB ± 0% 147kB ± 0% -10.29% (p=0.006 n=7+9)
MapAssignPreAllocate/Int64/8192-16 321kB ± 0% 295kB ± 0% -7.99% (p=0.000 n=10+9)
MapAssignPreAllocate/Int64/65536-16 2.51MB ± 0% 2.36MB ± 0% -6.19% (p=0.000 n=10+10)
MapAssignPreAllocate/Int32/6-16 0.00B 0.00B ~ (all equal)
MapAssignPreAllocate/Int32/12-16 248B ± 0% 224B ± 0% -9.68% (p=0.000 n=10+10)
MapAssignPreAllocate/Int32/18-16 461B ± 0% 448B ± 0% -2.82% (p=0.000 n=10+10)
MapAssignPreAllocate/Int32/24-16 528B ± 0% 448B ± 0% -15.15% (p=0.000 n=10+10)
MapAssignPreAllocate/Int32/30-16 908B ± 0% 896B ± 0% -1.32% (p=0.000 n=10+10)
MapAssignPreAllocate/Int32/64-16 2.08kB ± 0% 1.79kB ± 0% -13.85% (p=0.000 n=10+10)
MapAssignPreAllocate/Int32/128-16 4.14kB ± 0% 4.10kB ± 0% -1.01% (p=0.000 n=10+10)
MapAssignPreAllocate/Int32/256-16 8.25kB ± 0% 8.19kB ± 0% -0.71% (p=0.000 n=10+10)
MapAssignPreAllocate/Int32/512-16 16.5kB ± 0% 14.3kB ± 0% -12.98% (p=0.000 n=10+10)
MapAssignPreAllocate/Int32/1024-16 32.9kB ± 0% 28.7kB ± 0% -12.91% (p=0.000 n=10+10)
MapAssignPreAllocate/Int32/2048-16 65.8kB ± 0% 57.3kB ± 0% -12.87% (p=0.000 n=10+10)
MapAssignPreAllocate/Int32/4096-16 123kB ± 0% 115kB ± 0% -7.07% (p=0.000 n=10+10)
MapAssignPreAllocate/Int32/8192-16 247kB ± 0% 229kB ± 0% -7.06% (p=0.000 n=10+10)
MapAssignPreAllocate/Int32/65536-16 1.96MB ± 0% 1.84MB ± 0% -6.28% (p=0.000 n=10+9)
MapAssignPreAllocate/Str/6-16 0.00B 0.00B ~ (all equal)
MapAssignPreAllocate/Str/12-16 446B ± 0% 416B ± 0% -6.73% (p=0.000 n=10+10)
MapAssignPreAllocate/Str/18-16 912B ± 0% 896B ± 0% -1.75% (p=0.000 n=10+10)
MapAssignPreAllocate/Str/24-16 1.00kB ± 0% 0.90kB ± 0% -10.04% (p=0.002 n=8+10)
MapAssignPreAllocate/Str/30-16 1.81kB ± 0% 1.79kB ± 0% -0.81% (p=0.000 n=10+10)
MapAssignPreAllocate/Str/64-16 4.12kB ± 0% 3.46kB ± 0% -16.12% (p=0.000 n=10+10)
MapAssignPreAllocate/Str/128-16 8.22kB ± 0% 6.78kB ± 0% -17.43% (p=0.000 n=10+10)
MapAssignPreAllocate/Str/256-16 14.4kB ± 0% 13.6kB ± 0% -5.52% (p=0.000 n=10+10)
MapAssignPreAllocate/Str/512-16 28.7kB ± 0% 27.3kB ± 0% -4.99% (p=0.000 n=10+10)
MapAssignPreAllocate/Str/1024-16 57.4kB ± 0% 57.3kB ± 0% -0.04% (p=0.000 n=10+10)
MapAssignPreAllocate/Str/2048-16 115kB ± 0% 106kB ± 0% -7.16% (p=0.000 n=10+10)
MapAssignPreAllocate/Str/4096-16 229kB ± 0% 213kB ± 0% -7.15% (p=0.000 n=10+8)
MapAssignPreAllocate/Str/8192-16 459kB ± 0% 426kB ± 0% -7.15% (p=0.001 n=8+9)
MapAssignPreAllocate/Str/65536-16 3.62MB ± 0% 3.41MB ± 0% -5.88% (p=0.000 n=9+10)
MapAssignReuse/Pointer/6-16 48.0B ± 0% 48.0B ± 0% ~ (all equal)
MapAssignReuse/Pointer/12-16 117B ± 1% 96B ± 0% -17.74% (p=0.000 n=10+10)
MapAssignReuse/Pointer/18-16 155B ± 0% 144B ± 0% -7.10% (p=0.000 n=10+10)
MapAssignReuse/Pointer/24-16 261B ± 0% 192B ± 0% -26.52% (p=0.000 n=10+10)
MapAssignReuse/Pointer/30-16 250B ± 0% 240B ± 0% -4.00% (p=0.000 n=10+10)
MapAssignReuse/Pointer/64-16 512B ± 0% 512B ± 0% ~ (all equal)
MapAssignReuse/Pointer/128-16 1.02kB ± 0% 1.02kB ± 0% ~ (all equal)
MapAssignReuse/Pointer/256-16 2.05kB ± 0% 2.05kB ± 0% ~ (all equal)
MapAssignReuse/Pointer/512-16 4.10kB ± 0% 4.10kB ± 0% ~ (all equal)
MapAssignReuse/Pointer/1024-16 8.19kB ± 0% 8.19kB ± 0% ~ (all equal)
MapAssignReuse/Pointer/2048-16 16.4kB ± 0% 16.4kB ± 0% ~ (all equal)
MapAssignReuse/Pointer/4096-16 32.8kB ± 0% 32.8kB ± 0% ~ (all equal)
MapAssignReuse/Pointer/8192-16 65.5kB ± 0% 65.5kB ± 0% ~ (all equal)
MapAssignReuse/Pointer/65536-16 524kB ± 0% 524kB ± 0% ~ (p=0.137 n=10+8)
MapAssignReuse/Int64/6-16 0.00B 0.00B ~ (all equal)
MapAssignReuse/Int64/12-16 25.0B ± 0% 0.0B -100.00% (p=0.000 n=10+10)
MapAssignReuse/Int64/18-16 13.0B ± 0% 0.0B -100.00% (p=0.000 n=10+10)
MapAssignReuse/Int64/24-16 85.0B ± 0% 0.0B -100.00% (p=0.000 n=10+10)
MapAssignReuse/Int64/30-16 12.0B ± 0% 0.0B -100.00% (p=0.000 n=10+10)
MapAssignReuse/Int64/64-16 8.00B ± 0% 0.00B -100.00% (p=0.000 n=10+10)
MapAssignReuse/Int64/128-16 18.0B ± 0% 0.0B -100.00% (p=0.000 n=10+10)
MapAssignReuse/Int64/256-16 34.0B ± 0% 0.0B -100.00% (p=0.000 n=10+10)
MapAssignReuse/Int64/512-16 66.0B ± 0% 0.0B -100.00% (p=0.000 n=10+10)
MapAssignReuse/Int64/1024-16 128B ± 0% 0B -100.00% (p=0.000 n=9+10)
MapAssignReuse/Int64/2048-16 252B ± 0% 0B -100.00% (p=0.000 n=10+10)
MapAssignReuse/Int64/4096-16 506B ± 0% 0B -100.00% (p=0.000 n=10+10)
MapAssignReuse/Int64/8192-16 1.03kB ± 0% 0.00kB -100.00% (p=0.000 n=9+10)
MapAssignReuse/Int64/65536-16 8.21kB ± 0% 0.00kB -100.00% (p=0.000 n=10+10)
MapAssignReuse/Int32/6-16 0.00B 0.00B ~ (all equal)
MapAssignReuse/Int32/12-16 20.7B ± 3% 0.0B -100.00% (p=0.000 n=10+10)
MapAssignReuse/Int32/18-16 11.0B ± 0% 0.0B -100.00% (p=0.000 n=10+10)
MapAssignReuse/Int32/24-16 69.0B ± 0% 0.0B -100.00% (p=0.000 n=10+10)
MapAssignReuse/Int32/30-16 10.0B ± 0% 0.0B -100.00% (p=0.000 n=10+10)
MapAssignReuse/Int32/64-16 8.00B ± 0% 0.00B -100.00% (p=0.000 n=10+10)
MapAssignReuse/Int32/128-16 18.0B ± 0% 0.0B -100.00% (p=0.000 n=10+10)
MapAssignReuse/Int32/256-16 34.0B ± 0% 0.0B -100.00% (p=0.002 n=8+10)
MapAssignReuse/Int32/512-16 66.0B ± 0% 0.0B -100.00% (p=0.000 n=10+10)
MapAssignReuse/Int32/1024-16 128B ± 0% 0B -100.00% (p=0.000 n=9+10)
MapAssignReuse/Int32/2048-16 252B ± 0% 0B -100.00% (p=0.000 n=10+10)
MapAssignReuse/Int32/4096-16 506B ± 0% 0B -100.00% (p=0.000 n=10+10)
MapAssignReuse/Int32/8192-16 1.03kB ± 0% 0.00kB -100.00% (p=0.000 n=10+10)
MapAssignReuse/Int32/65536-16 8.21kB ± 0% 0.00kB -100.00% (p=0.000 n=10+10)
MapAssignReuse/Str/6-16 0.00B 0.00B ~ (all equal)
MapAssignReuse/Str/12-16 30.0B ± 0% 0.0B -100.00% (p=0.000 n=10+10)
MapAssignReuse/Str/18-16 16.0B ± 0% 0.0B -100.00% (p=0.000 n=10+10)
MapAssignReuse/Str/24-16 100B ± 0% 0B -100.00% (p=0.000 n=10+10)
MapAssignReuse/Str/30-16 14.7B ± 5% 0.0B -100.00% (p=0.000 n=10+10)
MapAssignReuse/Str/64-16 0.00B 0.00B ~ (all equal)
MapAssignReuse/Str/128-16 0.00B 0.00B ~ (all equal)
MapAssignReuse/Str/256-16 0.30B ±233% 0.00B ~ (p=0.211 n=10+10)
MapAssignReuse/Str/512-16 0.00B 0.00B ~ (all equal)
MapAssignReuse/Str/1024-16 0.00B 0.00B ~ (all equal)
MapAssignReuse/Str/2048-16 0.00B 0.00B ~ (all equal)
MapAssignReuse/Str/4096-16 0.00B 0.00B ~ (all equal)
MapAssignReuse/Str/8192-16 0.00B 0.00B ~ (all equal)
MapAssignReuse/Str/65536-16 0.00B 0.00B ~ (all equal)

name old allocs/op new allocs/op delta
MapIter/Int/6-16 0.00 0.00 ~ (all equal)
MapIter/Int/12-16 0.00 0.00 ~ (all equal)
MapIter/Int/18-16 0.00 0.00 ~ (all equal)
MapIter/Int/24-16 0.00 0.00 ~ (all equal)
MapIter/Int/30-16 0.00 0.00 ~ (all equal)
MapIter/Int/64-16 0.00 0.00 ~ (all equal)
MapIter/Int/128-16 0.00 0.00 ~ (all equal)
MapIter/Int/256-16 0.00 0.00 ~ (all equal)
MapIter/Int/512-16 0.00 0.00 ~ (all equal)
MapIter/Int/1024-16 0.00 0.00 ~ (all equal)
MapIter/Int/2048-16 0.00 0.00 ~ (all equal)
MapIter/Int/4096-16 0.00 0.00 ~ (all equal)
MapIter/Int/8192-16 0.00 0.00 ~ (all equal)
MapIter/Int/65536-16 0.00 0.00 ~ (all equal)
MapAccessHit/Int64/6-16 0.00 0.00 ~ (all equal)
MapAccessHit/Int64/12-16 0.00 0.00 ~ (all equal)
MapAccessHit/Int64/18-16 0.00 0.00 ~ (all equal)
MapAccessHit/Int64/24-16 0.00 0.00 ~ (all equal)
MapAccessHit/Int64/30-16 0.00 0.00 ~ (all equal)
MapAccessHit/Int64/64-16 0.00 0.00 ~ (all equal)
MapAccessHit/Int64/128-16 0.00 0.00 ~ (all equal)
MapAccessHit/Int64/256-16 0.00 0.00 ~ (all equal)
MapAccessHit/Int64/512-16 0.00 0.00 ~ (all equal)
MapAccessHit/Int64/1024-16 0.00 0.00 ~ (all equal)
MapAccessHit/Int64/2048-16 0.00 0.00 ~ (all equal)
MapAccessHit/Int64/4096-16 0.00 0.00 ~ (all equal)
MapAccessHit/Int64/8192-16 0.00 0.00 ~ (all equal)
MapAccessHit/Int64/65536-16 0.00 0.00 ~ (all equal)
MapAccessHit/Int32/6-16 0.00 0.00 ~ (all equal)
MapAccessHit/Int32/12-16 0.00 0.00 ~ (all equal)
MapAccessHit/Int32/18-16 0.00 0.00 ~ (all equal)
MapAccessHit/Int32/24-16 0.00 0.00 ~ (all equal)
MapAccessHit/Int32/30-16 0.00 0.00 ~ (all equal)
MapAccessHit/Int32/64-16 0.00 0.00 ~ (all equal)
MapAccessHit/Int32/128-16 0.00 0.00 ~ (all equal)
MapAccessHit/Int32/256-16 0.00 0.00 ~ (all equal)
MapAccessHit/Int32/512-16 0.00 0.00 ~ (all equal)
MapAccessHit/Int32/1024-16 0.00 0.00 ~ (all equal)
MapAccessHit/Int32/2048-16 0.00 0.00 ~ (all equal)
MapAccessHit/Int32/4096-16 0.00 0.00 ~ (all equal)
MapAccessHit/Int32/8192-16 0.00 0.00 ~ (all equal)
MapAccessHit/Int32/65536-16 0.00 0.00 ~ (all equal)
MapAccessHit/Str/6-16 0.00 0.00 ~ (all equal)
MapAccessHit/Str/12-16 0.00 0.00 ~ (all equal)
MapAccessHit/Str/18-16 0.00 0.00 ~ (all equal)
MapAccessHit/Str/24-16 0.00 0.00 ~ (all equal)
MapAccessHit/Str/30-16 0.00 0.00 ~ (all equal)
MapAccessHit/Str/64-16 0.00 0.00 ~ (all equal)
MapAccessHit/Str/128-16 0.00 0.00 ~ (all equal)
MapAccessHit/Str/256-16 0.00 0.00 ~ (all equal)
MapAccessHit/Str/512-16 0.00 0.00 ~ (all equal)
MapAccessHit/Str/1024-16 0.00 0.00 ~ (all equal)
MapAccessHit/Str/2048-16 0.00 0.00 ~ (all equal)
MapAccessHit/Str/4096-16 0.00 0.00 ~ (all equal)
MapAccessHit/Str/8192-16 0.00 0.00 ~ (all equal)
MapAccessHit/Str/65536-16 0.00 0.00 ~ (all equal)
MapAccessMiss/Int64/6-16 0.00 0.00 ~ (all equal)
MapAccessMiss/Int64/12-16 0.00 0.00 ~ (all equal)
MapAccessMiss/Int64/18-16 0.00 0.00 ~ (all equal)
MapAccessMiss/Int64/24-16 0.00 0.00 ~ (all equal)
MapAccessMiss/Int64/30-16 0.00 0.00 ~ (all equal)
MapAccessMiss/Int64/64-16 0.00 0.00 ~ (all equal)
MapAccessMiss/Int64/128-16 0.00 0.00 ~ (all equal)
MapAccessMiss/Int64/256-16 0.00 0.00 ~ (all equal)
MapAccessMiss/Int64/512-16 0.00 0.00 ~ (all equal)
MapAccessMiss/Int64/1024-16 0.00 0.00 ~ (all equal)
MapAccessMiss/Int64/2048-16 0.00 0.00 ~ (all equal)
MapAccessMiss/Int64/4096-16 0.00 0.00 ~ (all equal)
MapAccessMiss/Int64/8192-16 0.00 0.00 ~ (all equal)
MapAccessMiss/Int64/65536-16 0.00 0.00 ~ (all equal)
MapAccessMiss/Int32/6-16 0.00 0.00 ~ (all equal)
MapAccessMiss/Int32/12-16 0.00 0.00 ~ (all equal)
MapAccessMiss/Int32/18-16 0.00 0.00 ~ (all equal)
MapAccessMiss/Int32/24-16 0.00 0.00 ~ (all equal)
MapAccessMiss/Int32/30-16 0.00 0.00 ~ (all equal)
MapAccessMiss/Int32/64-16 0.00 0.00 ~ (all equal)
MapAccessMiss/Int32/128-16 0.00 0.00 ~ (all equal)
MapAccessMiss/Int32/256-16 0.00 0.00 ~ (all equal)
MapAccessMiss/Int32/512-16 0.00 0.00 ~ (all equal)
MapAccessMiss/Int32/1024-16 0.00 0.00 ~ (all equal)
MapAccessMiss/Int32/2048-16 0.00 0.00 ~ (all equal)
MapAccessMiss/Int32/4096-16 0.00 0.00 ~ (all equal)
MapAccessMiss/Int32/8192-16 0.00 0.00 ~ (all equal)
MapAccessMiss/Int32/65536-16 0.00 0.00 ~ (all equal)
MapAccessMiss/Str/6-16 0.00 0.00 ~ (all equal)
MapAccessMiss/Str/12-16 0.00 0.00 ~ (all equal)
MapAccessMiss/Str/18-16 0.00 0.00 ~ (all equal)
MapAccessMiss/Str/24-16 0.00 0.00 ~ (all equal)
MapAccessMiss/Str/30-16 0.00 0.00 ~ (all equal)
MapAccessMiss/Str/64-16 0.00 0.00 ~ (all equal)
MapAccessMiss/Str/128-16 0.00 0.00 ~ (all equal)
MapAccessMiss/Str/256-16 0.00 0.00 ~ (all equal)
MapAccessMiss/Str/512-16 0.00 0.00 ~ (all equal)
MapAccessMiss/Str/1024-16 0.00 0.00 ~ (all equal)
MapAccessMiss/Str/2048-16 0.00 0.00 ~ (all equal)
MapAccessMiss/Str/4096-16 0.00 0.00 ~ (all equal)
MapAccessMiss/Str/8192-16 0.00 0.00 ~ (all equal)
MapAccessMiss/Str/65536-16 0.00 0.00 ~ (all equal)
MapAssignGrow/Int64/6-16 0.00 0.00 ~ (all equal)
MapAssignGrow/Int64/12-16 1.00 ± 0% 1.00 ± 0% ~ (all equal)
MapAssignGrow/Int64/18-16 3.00 ± 0% 2.00 ± 0% -33.33% (p=0.000 n=10+10)
MapAssignGrow/Int64/24-16 4.00 ± 0% 2.00 ± 0% -50.00% (p=0.000 n=10+10)
MapAssignGrow/Int64/30-16 6.00 ± 0% 3.00 ± 0% -50.00% (p=0.000 n=10+10)
MapAssignGrow/Int64/64-16 12.0 ± 0% 4.0 ± 0% -66.67% (p=0.000 n=10+10)
MapAssignGrow/Int64/128-16 19.0 ± 0% 5.0 ± 0% -73.68% (p=0.000 n=10+10)
MapAssignGrow/Int64/256-16 27.0 ± 0% 6.0 ± 0% -77.78% (p=0.000 n=10+10)
MapAssignGrow/Int64/512-16 42.0 ± 0% 7.0 ± 0% -83.33% (p=0.000 n=10+10)
MapAssignGrow/Int64/1024-16 64.0 ± 0% 8.0 ± 0% -87.50% (p=0.000 n=10+10)
MapAssignGrow/Int64/2048-16 100 ± 1% 9 ± 0% -90.96% (p=0.000 n=10+10)
MapAssignGrow/Int64/4096-16 162 ± 0% 10 ± 0% -93.81% (p=0.000 n=10+10)
MapAssignGrow/Int64/8192-16 274 ± 0% 11 ± 0% -95.99% (p=0.000 n=10+10)
MapAssignGrow/Int64/65536-16 2.35k ± 0% 0.01k ± 0% -99.40% (p=0.000 n=10+10)
MapAssignGrow/Int32/6-16 0.00 0.00 ~ (all equal)
MapAssignGrow/Int32/12-16 1.00 ± 0% 1.00 ± 0% ~ (all equal)
MapAssignGrow/Int32/18-16 3.00 ± 0% 2.00 ± 0% -33.33% (p=0.000 n=10+10)
MapAssignGrow/Int32/24-16 4.00 ± 0% 2.00 ± 0% -50.00% (p=0.000 n=10+10)
MapAssignGrow/Int32/30-16 6.00 ± 0% 3.00 ± 0% -50.00% (p=0.000 n=10+10)
MapAssignGrow/Int32/64-16 12.0 ± 0% 4.0 ± 0% -66.67% (p=0.000 n=10+10)
MapAssignGrow/Int32/128-16 19.0 ± 0% 5.0 ± 0% -73.68% (p=0.000 n=10+10)
MapAssignGrow/Int32/256-16 28.0 ± 0% 6.0 ± 0% -78.57% (p=0.000 n=10+10)
MapAssignGrow/Int32/512-16 41.0 ± 0% 7.0 ± 0% -82.93% (p=0.000 n=10+10)
MapAssignGrow/Int32/1024-16 59.0 ± 0% 8.0 ± 0% -86.44% (p=0.000 n=10+10)
MapAssignGrow/Int32/2048-16 86.5 ± 1% 9.0 ± 0% -89.60% (p=0.000 n=10+10)
MapAssignGrow/Int32/4096-16 131 ± 1% 10 ± 0% -92.38% (p=0.000 n=10+10)
MapAssignGrow/Int32/8192-16 284 ± 0% 11 ± 0% -96.13% (p=0.002 n=8+10)
MapAssignGrow/Int32/65536-16 2.37k ± 0% 0.01k ± 0% -99.41% (p=0.000 n=10+10)
MapAssignGrow/Str/6-16 0.00 0.00 ~ (all equal)
MapAssignGrow/Str/12-16 1.00 ± 0% 1.00 ± 0% ~ (all equal)
MapAssignGrow/Str/18-16 2.00 ± 0% 2.00 ± 0% ~ (all equal)
MapAssignGrow/Str/24-16 2.00 ± 0% 2.00 ± 0% ~ (all equal)
MapAssignGrow/Str/30-16 4.00 ± 0% 3.00 ± 0% -25.00% (p=0.000 n=10+10)
MapAssignGrow/Str/64-16 7.00 ± 0% 4.00 ± 0% -42.86% (p=0.000 n=10+10)
MapAssignGrow/Str/128-16 9.00 ± 0% 5.00 ± 0% -44.44% (p=0.000 n=10+10)
MapAssignGrow/Str/256-16 10.0 ± 0% 6.0 ± 0% -40.00% (p=0.000 n=10+10)
MapAssignGrow/Str/512-16 20.0 ± 0% 7.0 ± 0% -65.00% (p=0.000 n=10+10)
MapAssignGrow/Str/1024-16 39.0 ± 0% 8.0 ± 0% -79.49% (p=0.000 n=10+10)
MapAssignGrow/Str/2048-16 74.0 ± 0% 9.0 ± 0% -87.84% (p=0.000 n=10+10)
MapAssignGrow/Str/4096-16 143 ± 0% 10 ± 0% -93.01% (p=0.000 n=10+10)
MapAssignGrow/Str/8192-16 280 ± 0% 11 ± 0% -96.07% (p=0.002 n=8+10)
MapAssignGrow/Str/65536-16 2.33k ± 0% 0.01k ± 0% -99.40% (p=0.000 n=10+10)
MapAssignPreAllocate/Pointer/6-16 6.00 ± 0% 6.00 ± 0% ~ (all equal)
MapAssignPreAllocate/Pointer/12-16 13.0 ± 0% 13.0 ± 0% ~ (all equal)
MapAssignPreAllocate/Pointer/18-16 19.0 ± 0% 19.0 ± 0% ~ (all equal)
MapAssignPreAllocate/Pointer/24-16 25.0 ± 0% 25.0 ± 0% ~ (all equal)
MapAssignPreAllocate/Pointer/30-16 31.0 ± 0% 31.0 ± 0% ~ (all equal)
MapAssignPreAllocate/Pointer/64-16 66.0 ± 0% 65.0 ± 0% -1.52% (p=0.000 n=10+10)
MapAssignPreAllocate/Pointer/128-16 130 ± 0% 129 ± 0% -0.77% (p=0.000 n=10+10)
MapAssignPreAllocate/Pointer/256-16 258 ± 0% 257 ± 0% -0.39% (p=0.000 n=10+10)
MapAssignPreAllocate/Pointer/512-16 514 ± 0% 513 ± 0% -0.19% (p=0.000 n=10+10)
MapAssignPreAllocate/Pointer/1024-16 1.03k ± 0% 1.02k ± 0% -0.10% (p=0.000 n=10+10)
MapAssignPreAllocate/Pointer/2048-16 2.05k ± 0% 2.05k ± 0% -0.05% (p=0.000 n=10+10)
MapAssignPreAllocate/Pointer/4096-16 4.10k ± 0% 4.10k ± 0% -0.02% (p=0.000 n=10+10)
MapAssignPreAllocate/Pointer/8192-16 8.19k ± 0% 8.19k ± 0% -0.01% (p=0.000 n=10+10)
MapAssignPreAllocate/Pointer/65536-16 65.5k ± 0% 65.5k ± 0% -0.00% (p=0.000 n=10+10)
MapAssignPreAllocate/Int64/6-16 0.00 0.00 ~ (all equal)
MapAssignPreAllocate/Int64/12-16 1.00 ± 0% 1.00 ± 0% ~ (all equal)
MapAssignPreAllocate/Int64/18-16 1.00 ± 0% 1.00 ± 0% ~ (all equal)
MapAssignPreAllocate/Int64/24-16 2.00 ± 0% 1.00 ± 0% -50.00% (p=0.000 n=10+10)
MapAssignPreAllocate/Int64/30-16 1.00 ± 0% 1.00 ± 0% ~ (all equal)
MapAssignPreAllocate/Int64/64-16 2.00 ± 0% 1.00 ± 0% -50.00% (p=0.000 n=10+10)
MapAssignPreAllocate/Int64/128-16 3.00 ± 0% 1.00 ± 0% -66.67% (p=0.000 n=10+10)
MapAssignPreAllocate/Int64/256-16 4.00 ± 0% 1.00 ± 0% -75.00% (p=0.000 n=10+10)
MapAssignPreAllocate/Int64/512-16 5.00 ± 0% 1.00 ± 0% -80.00% (p=0.000 n=10+10)
MapAssignPreAllocate/Int64/1024-16 6.00 ± 0% 1.00 ± 0% -83.33% (p=0.000 n=10+10)
MapAssignPreAllocate/Int64/2048-16 7.00 ± 0% 1.00 ± 0% -85.71% (p=0.000 n=10+10)
MapAssignPreAllocate/Int64/4096-16 8.00 ± 0% 1.00 ± 0% -87.50% (p=0.000 n=10+10)
MapAssignPreAllocate/Int64/8192-16 9.00 ± 0% 1.00 ± 0% -88.89% (p=0.000 n=10+10)
MapAssignPreAllocate/Int64/65536-16 13.0 ± 0% 1.0 ± 0% -92.31% (p=0.000 n=10+10)
MapAssignPreAllocate/Int32/6-16 0.00 0.00 ~ (all equal)
MapAssignPreAllocate/Int32/12-16 1.00 ± 0% 1.00 ± 0% ~ (all equal)
MapAssignPreAllocate/Int32/18-16 1.00 ± 0% 1.00 ± 0% ~ (all equal)
MapAssignPreAllocate/Int32/24-16 2.00 ± 0% 1.00 ± 0% -50.00% (p=0.000 n=10+10)
MapAssignPreAllocate/Int32/30-16 1.00 ± 0% 1.00 ± 0% ~ (all equal)
MapAssignPreAllocate/Int32/64-16 2.00 ± 0% 1.00 ± 0% -50.00% (p=0.000 n=10+10)
MapAssignPreAllocate/Int32/128-16 3.00 ± 0% 1.00 ± 0% -66.67% (p=0.000 n=10+10)
MapAssignPreAllocate/Int32/256-16 4.00 ± 0% 1.00 ± 0% -75.00% (p=0.000 n=10+10)
MapAssignPreAllocate/Int32/512-16 5.00 ± 0% 1.00 ± 0% -80.00% (p=0.000 n=10+10)
MapAssignPreAllocate/Int32/1024-16 6.00 ± 0% 1.00 ± 0% -83.33% (p=0.000 n=10+10)
MapAssignPreAllocate/Int32/2048-16 7.00 ± 0% 1.00 ± 0% -85.71% (p=0.000 n=10+10)
MapAssignPreAllocate/Int32/4096-16 8.00 ± 0% 1.00 ± 0% -87.50% (p=0.000 n=10+10)
MapAssignPreAllocate/Int32/8192-16 9.00 ± 0% 1.00 ± 0% -88.89% (p=0.000 n=10+10)
MapAssignPreAllocate/Int32/65536-16 13.0 ± 0% 1.0 ± 0% -92.31% (p=0.000 n=10+10)
MapAssignPreAllocate/Str/6-16 0.00 0.00 ~ (all equal)
MapAssignPreAllocate/Str/12-16 1.00 ± 0% 1.00 ± 0% ~ (all equal)
MapAssignPreAllocate/Str/18-16 1.00 ± 0% 1.00 ± 0% ~ (all equal)
MapAssignPreAllocate/Str/24-16 1.00 ± 0% 1.00 ± 0% ~ (all equal)
MapAssignPreAllocate/Str/30-16 1.00 ± 0% 1.00 ± 0% ~ (all equal)
MapAssignPreAllocate/Str/64-16 2.00 ± 0% 1.00 ± 0% -50.00% (p=0.000 n=10+10)
MapAssignPreAllocate/Str/128-16 2.00 ± 0% 1.00 ± 0% -50.00% (p=0.000 n=10+10)
MapAssignPreAllocate/Str/256-16 2.00 ± 0% 1.00 ± 0% -50.00% (p=0.000 n=10+10)
MapAssignPreAllocate/Str/512-16 2.00 ± 0% 1.00 ± 0% -50.00% (p=0.000 n=10+10)
MapAssignPreAllocate/Str/1024-16 2.00 ± 0% 1.00 ± 0% -50.00% (p=0.000 n=10+10)
MapAssignPreAllocate/Str/2048-16 2.00 ± 0% 1.00 ± 0% -50.00% (p=0.000 n=10+10)
MapAssignPreAllocate/Str/4096-16 2.00 ± 0% 1.00 ± 0% -50.00% (p=0.000 n=10+10)
MapAssignPreAllocate/Str/8192-16 2.00 ± 0% 1.00 ± 0% -50.00% (p=0.000 n=10+10)
MapAssignPreAllocate/Str/65536-16 2.00 ± 0% 1.00 ± 0% -50.00% (p=0.000 n=10+10)
MapAssignReuse/Pointer/6-16 6.00 ± 0% 6.00 ± 0% ~ (all equal)
MapAssignReuse/Pointer/12-16 12.0 ± 0% 12.0 ± 0% ~ (all equal)
MapAssignReuse/Pointer/18-16 18.0 ± 0% 18.0 ± 0% ~ (all equal)
MapAssignReuse/Pointer/24-16 24.0 ± 0% 24.0 ± 0% ~ (all equal)
MapAssignReuse/Pointer/30-16 30.0 ± 0% 30.0 ± 0% ~ (all equal)
MapAssignReuse/Pointer/64-16 64.0 ± 0% 64.0 ± 0% ~ (all equal)
MapAssignReuse/Pointer/128-16 128 ± 0% 128 ± 0% ~ (all equal)
MapAssignReuse/Pointer/256-16 256 ± 0% 256 ± 0% ~ (all equal)
MapAssignReuse/Pointer/512-16 512 ± 0% 512 ± 0% ~ (all equal)
MapAssignReuse/Pointer/1024-16 1.02k ± 0% 1.02k ± 0% ~ (all equal)
MapAssignReuse/Pointer/2048-16 2.05k ± 0% 2.05k ± 0% ~ (all equal)
MapAssignReuse/Pointer/4096-16 4.10k ± 0% 4.10k ± 0% ~ (all equal)
MapAssignReuse/Pointer/8192-16 8.19k ± 0% 8.19k ± 0% ~ (all equal)
MapAssignReuse/Pointer/65536-16 65.5k ± 0% 65.5k ± 0% ~ (all equal)
MapAssignReuse/Int64/6-16 0.00 0.00 ~ (all equal)
MapAssignReuse/Int64/12-16 0.00 0.00 ~ (all equal)
MapAssignReuse/Int64/18-16 0.00 0.00 ~ (all equal)
MapAssignReuse/Int64/24-16 1.00 ± 0% 0.00 -100.00% (p=0.000 n=10+10)
MapAssignReuse/Int64/30-16 0.00 0.00 ~ (all equal)
MapAssignReuse/Int64/64-16 0.00 0.00 ~ (all equal)
MapAssignReuse/Int64/128-16 1.00 ± 0% 0.00 -100.00% (p=0.000 n=10+10)
MapAssignReuse/Int64/256-16 2.00 ± 0% 0.00 -100.00% (p=0.000 n=10+10)
MapAssignReuse/Int64/512-16 3.00 ± 0% 0.00 -100.00% (p=0.000 n=10+10)
MapAssignReuse/Int64/1024-16 4.00 ± 0% 0.00 -100.00% (p=0.000 n=10+10)
MapAssignReuse/Int64/2048-16 5.00 ± 0% 0.00 -100.00% (p=0.000 n=10+10)
MapAssignReuse/Int64/4096-16 6.00 ± 0% 0.00 -100.00% (p=0.000 n=10+10)
MapAssignReuse/Int64/8192-16 7.00 ± 0% 0.00 -100.00% (p=0.000 n=10+10)
MapAssignReuse/Int64/65536-16 11.0 ± 0% 0.0 -100.00% (p=0.000 n=10+10)
MapAssignReuse/Int32/6-16 0.00 0.00 ~ (all equal)
MapAssignReuse/Int32/12-16 0.00 0.00 ~ (all equal)
MapAssignReuse/Int32/18-16 0.00 0.00 ~ (all equal)
MapAssignReuse/Int32/24-16 1.00 ± 0% 0.00 -100.00% (p=0.000 n=10+10)
MapAssignReuse/Int32/30-16 0.00 0.00 ~ (all equal)
MapAssignReuse/Int32/64-16 0.00 0.00 ~ (all equal)
MapAssignReuse/Int32/128-16 1.00 ± 0% 0.00 -100.00% (p=0.000 n=10+10)
MapAssignReuse/Int32/256-16 2.00 ± 0% 0.00 -100.00% (p=0.000 n=10+10)
MapAssignReuse/Int32/512-16 3.00 ± 0% 0.00 -100.00% (p=0.000 n=10+10)
MapAssignReuse/Int32/1024-16 4.00 ± 0% 0.00 -100.00% (p=0.000 n=10+10)
MapAssignReuse/Int32/2048-16 5.00 ± 0% 0.00 -100.00% (p=0.000 n=10+10)
MapAssignReuse/Int32/4096-16 6.00 ± 0% 0.00 -100.00% (p=0.000 n=10+10)
MapAssignReuse/Int32/8192-16 7.00 ± 0% 0.00 -100.00% (p=0.000 n=10+10)
MapAssignReuse/Int32/65536-16 11.0 ± 0% 0.0 -100.00% (p=0.000 n=10+10)
MapAssignReuse/Str/6-16 0.00 0.00 ~ (all equal)
MapAssignReuse/Str/12-16 0.00 0.00 ~ (all equal)
MapAssignReuse/Str/18-16 0.00 0.00 ~ (all equal)
MapAssignReuse/Str/24-16 0.00 0.00 ~ (all equal)
MapAssignReuse/Str/30-16 0.00 0.00 ~ (all equal)
MapAssignReuse/Str/64-16 0.00 0.00 ~ (all equal)
MapAssignReuse/Str/128-16 0.00 0.00 ~ (all equal)
MapAssignReuse/Str/256-16 0.00 0.00 ~ (all equal)
MapAssignReuse/Str/512-16 0.00 0.00 ~ (all equal)
MapAssignReuse/Str/1024-16 0.00 0.00 ~ (all equal)
MapAssignReuse/Str/2048-16 0.00 0.00 ~ (all equal)
MapAssignReuse/Str/4096-16 0.00 0.00 ~ (all equal)
MapAssignReuse/Str/8192-16 0.00 0.00 ~ (all equal)
MapAssignReuse/Str/65536-16 0.00 0.00 ~ (all equal)

Benchmark-2

The benchmarks from runtime.

INFO
name                              old time/op    new time/op      delta
MegMap-16                           9.01ns ± 1%      8.83ns ± 1%       -2.00%  (p=0.000 n=8+8)
MegOneMap-16                        4.59ns ± 1%      9.21ns ± 2%     +100.52%  (p=0.000 n=9+10)
MegEqMap-16                         20.4µs ± 2%      20.1µs ± 2%       -1.49%  (p=0.011 n=9+9)
MegEmptyMap-16                      2.18ns ± 3%      2.06ns ± 1%       -5.42%  (p=0.000 n=10+10)
SmallStrMap-16                      8.27ns ± 1%      7.17ns ± 4%      -13.31%  (p=0.000 n=8+10)
MapStringKeysEight_16-16            6.89ns ± 3%      7.79ns ± 1%      +13.09%  (p=0.000 n=9+8)
MapStringKeysEight_32-16            7.75ns ± 5%      7.97ns ± 0%       +2.83%  (p=0.000 n=10+7)
MapStringKeysEight_64-16            7.66ns ± 3%      8.76ns ± 1%      +14.43%  (p=0.000 n=10+7)
MapStringKeysEight_1M-16            7.72ns ± 3%  16483.00ns ± 1%  +213363.36%  (p=0.000 n=10+8)
IntMap-16                           5.21ns ± 1%      6.42ns ±16%      +23.30%  (p=0.000 n=8+10)
MapFirst/1-16                       2.68ns ± 1%      2.45ns ± 1%       -8.78%  (p=0.000 n=10+9)
MapFirst/2-16                       2.68ns ± 1%      2.43ns ± 1%       -9.34%  (p=0.000 n=9+9)
MapFirst/3-16                       2.66ns ± 2%      2.44ns ± 1%       -7.98%  (p=0.000 n=10+9)
MapFirst/4-16                       2.68ns ± 1%      2.44ns ± 0%       -8.67%  (p=0.000 n=8+9)
MapFirst/5-16                       2.69ns ± 1%      2.45ns ± 0%       -8.73%  (p=0.000 n=8+8)
MapFirst/6-16                       2.68ns ± 0%      2.44ns ± 1%       -8.78%  (p=0.000 n=8+9)
MapFirst/7-16                       2.69ns ± 1%      2.45ns ± 1%       -9.10%  (p=0.000 n=10+9)
MapFirst/8-16                       2.67ns ± 1%      4.79ns ± 1%      +79.47%  (p=0.000 n=10+9)
MapFirst/9-16                       4.66ns ± 1%      4.75ns ± 2%       +1.98%  (p=0.000 n=10+9)
MapFirst/10-16                      4.68ns ± 2%      4.73ns ± 1%       +1.19%  (p=0.016 n=9+10)
MapFirst/11-16                      4.69ns ± 2%      4.78ns ± 1%       +1.93%  (p=0.000 n=9+8)
MapFirst/12-16                      4.64ns ± 2%      4.75ns ± 2%       +2.47%  (p=0.005 n=10+10)
MapFirst/13-16                      4.69ns ± 1%      4.78ns ± 1%       +1.86%  (p=0.000 n=8+9)
MapFirst/14-16                      4.68ns ± 2%      4.79ns ± 1%       +2.34%  (p=0.000 n=10+8)
MapFirst/15-16                      4.67ns ± 1%      6.90ns ± 2%      +47.88%  (p=0.000 n=8+10)
MapFirst/16-16                      4.65ns ± 2%      6.95ns ± 1%      +49.60%  (p=0.000 n=10+9)
MapMid/1-16                         2.68ns ± 1%      2.62ns ± 1%       -2.15%  (p=0.000 n=10+9)
MapMid/2-16                         3.23ns ± 1%      2.95ns ± 1%       -8.59%  (p=0.000 n=10+9)
MapMid/3-16                         3.21ns ± 1%      2.94ns ± 0%       -8.33%  (p=0.000 n=10+7)
MapMid/4-16                         3.64ns ± 2%      3.46ns ± 1%       -4.84%  (p=0.000 n=10+8)
MapMid/5-16                         3.67ns ± 1%      3.47ns ± 1%       -5.46%  (p=0.000 n=10+8)
MapMid/6-16                         4.15ns ± 2%      3.93ns ± 1%       -5.25%  (p=0.000 n=10+9)
MapMid/7-16                         4.19ns ± 1%      3.91ns ± 1%       -6.55%  (p=0.000 n=10+10)
MapMid/8-16                         4.84ns ± 2%      5.76ns ±11%      +19.02%  (p=0.000 n=10+10)
MapMid/9-16                         5.66ns ±10%      5.83ns ± 9%         ~     (p=0.393 n=10+10)
MapMid/10-16                        5.81ns ± 5%      6.20ns ± 4%       +6.67%  (p=0.001 n=8+7)
MapMid/11-16                        5.80ns ± 4%      6.17ns ±11%         ~     (p=0.278 n=9+10)
MapMid/12-16                        5.87ns ±10%      6.26ns ± 2%       +6.48%  (p=0.008 n=9+7)
MapMid/13-16                        6.15ns ±13%      5.92ns ± 8%         ~     (p=0.315 n=10+8)
MapMid/14-16                        5.29ns ± 8%      6.18ns ±14%      +16.89%  (p=0.001 n=9+10)
MapMid/15-16                        5.44ns ±12%      7.04ns ± 2%      +29.37%  (p=0.000 n=10+10)
MapMid/16-16                        5.91ns ±11%      7.18ns ± 3%      +21.44%  (p=0.000 n=10+9)
MapLast/1-16                        2.69ns ± 1%      2.64ns ± 2%       -2.00%  (p=0.000 n=8+10)
MapLast/2-16                        3.22ns ± 2%      2.93ns ± 1%       -9.05%  (p=0.000 n=9+10)
MapLast/3-16                        3.66ns ± 2%      3.47ns ± 1%       -5.17%  (p=0.000 n=10+8)
MapLast/4-16                        4.20ns ± 1%      3.88ns ± 2%       -7.54%  (p=0.000 n=8+9)
MapLast/5-16                        4.85ns ± 2%      4.39ns ± 2%       -9.53%  (p=0.000 n=9+9)
MapLast/6-16                        5.33ns ± 1%      5.10ns ± 8%       -4.27%  (p=0.017 n=9+10)
MapLast/7-16                        5.79ns ± 1%      5.33ns ± 2%       -7.93%  (p=0.000 n=9+8)
MapLast/8-16                        6.28ns ± 1%      6.55ns ±17%         ~     (p=0.704 n=9+10)
MapLast/9-16                        6.90ns ±18%      6.87ns ±12%         ~     (p=1.000 n=9+9)
MapLast/10-16                       6.83ns ±15%      7.32ns ± 7%       +7.10%  (p=0.010 n=9+8)
MapLast/11-16                       7.84ns ± 3%      7.46ns ± 5%       -4.78%  (p=0.006 n=7+8)
MapLast/12-16                       7.58ns ± 9%      7.58ns ±12%         ~     (p=0.743 n=8+9)
MapLast/13-16                       9.15ns ±25%     14.06ns ± 2%      +53.70%  (p=0.000 n=10+8)
MapLast/14-16                       6.31ns ±15%      7.95ns ± 8%      +25.94%  (p=0.000 n=9+8)
MapLast/15-16                       6.20ns ±16%      7.11ns ± 2%      +14.59%  (p=0.004 n=10+10)
MapLast/16-16                       6.78ns ±19%      7.19ns ± 1%         ~     (p=0.139 n=9+8)
MapCycle-16                         11.5ns ± 2%      15.8ns ± 2%      +36.83%  (p=0.000 n=10+10)
RepeatedLookupStrMapKey32-16        9.37ns ± 2%      7.81ns ± 1%      -16.67%  (p=0.000 n=9+9)
RepeatedLookupStrMapKey1M-16        16.6µs ± 1%      16.6µs ± 2%         ~     (p=0.604 n=10+9)
MakeMap/[Byte]Byte-16                120ns ± 1%       116ns ± 1%       -3.61%  (p=0.000 n=10+10)
MakeMap/[Int]Int-16                  164ns ± 1%       160ns ± 0%       -2.36%  (p=0.000 n=10+9)
NewEmptyMap-16                      4.32ns ± 1%      4.55ns ± 3%       +5.26%  (p=0.000 n=10+10)
NewSmallMap-16                      19.4ns ± 2%      24.1ns ± 1%      +24.31%  (p=0.000 n=10+10)
MapIter-16                          73.7ns ± 2%      82.3ns ± 3%      +11.60%  (p=0.000 n=10+10)
MapIterEmpty-16                     3.65ns ± 1%      4.11ns ± 2%      +12.80%  (p=0.000 n=9+9)
SameLengthMap-16                    3.14ns ± 2%      3.38ns ± 2%       +7.50%  (p=0.000 n=9+10)
BigKeyMap-16                        10.0ns ± 4%      11.9ns ± 1%      +18.84%  (p=0.000 n=10+10)
BigValMap-16                        10.0ns ± 3%      11.9ns ± 2%      +18.74%  (p=0.000 n=10+10)
SmallKeyMap-16                      8.51ns ± 1%      9.91ns ± 1%      +16.44%  (p=0.000 n=10+9)
MapPopulate/1-16                    10.4ns ± 1%      14.4ns ± 2%      +38.28%  (p=0.000 n=9+9)
MapPopulate/10-16                    608ns ± 1%       495ns ± 1%      -18.58%  (p=0.000 n=10+10)
MapPopulate/100-16                  9.32µs ± 1%      6.28µs ± 1%      -32.59%  (p=0.000 n=9+10)
MapPopulate/1000-16                  111µs ± 0%        86µs ± 0%      -22.28%  (p=0.000 n=10+10)
MapPopulate/10000-16                 965µs ± 0%       745µs ± 1%      -22.78%  (p=0.000 n=10+10)
MapPopulate/100000-16               10.4ms ± 1%       7.4ms ± 0%      -28.46%  (p=0.000 n=10+10)
ComplexAlgMap-16                    20.6ns ± 1%      22.9ns ± 1%      +10.86%  (p=0.000 n=9+10)
GoMapClear/Reflexive/1-16           19.3ns ± 1%      17.9ns ± 1%       -7.39%  (p=0.000 n=10+10)
GoMapClear/Reflexive/10-16          21.2ns ± 1%      18.9ns ± 2%      -10.91%  (p=0.000 n=10+9)
GoMapClear/Reflexive/100-16         37.3ns ± 1%      40.2ns ± 1%       +7.90%  (p=0.000 n=9+9)
GoMapClear/Reflexive/1000-16         345ns ± 2%       433ns ± 1%      +25.73%  (p=0.000 n=10+10)
GoMapClear/Reflexive/10000-16       2.62µs ± 1%      3.94µs ± 1%      +50.33%  (p=0.000 n=10+10)
GoMapClear/NonReflexive/1-16        80.2ns ± 2%      62.8ns ± 2%      -21.61%  (p=0.000 n=9+9)
GoMapClear/NonReflexive/10-16       92.2ns ± 2%      72.5ns ± 2%      -21.42%  (p=0.000 n=10+10)
GoMapClear/NonReflexive/100-16       216ns ± 2%       101ns ± 1%      -53.49%  (p=0.000 n=9+8)
GoMapClear/NonReflexive/1000-16     2.13µs ± 1%      0.34µs ± 2%      -84.02%  (p=0.000 n=10+9)
GoMapClear/NonReflexive/10000-16    16.4µs ± 1%       2.1µs ± 1%      -86.96%  (p=0.000 n=10+8)
MapStringConversion/32/simple-16    7.79ns ± 1%     12.22ns ± 1%      +56.92%  (p=0.000 n=9+9)
MapStringConversion/32/struct-16    7.72ns ± 1%     12.32ns ± 2%      +59.70%  (p=0.000 n=9+10)
MapStringConversion/32/array-16     7.72ns ± 3%     12.00ns ± 3%      +55.34%  (p=0.000 n=10+9)
MapStringConversion/64/simple-16    7.47ns ± 1%     11.77ns ± 3%      +57.65%  (p=0.000 n=9+10)
MapStringConversion/64/struct-16    7.49ns ± 1%     11.94ns ± 2%      +59.38%  (p=0.000 n=9+10)
MapStringConversion/64/array-16     7.50ns ± 1%     11.92ns ± 2%      +58.89%  (p=0.000 n=9+10)
MapInterfaceString-16               11.2ns ± 5%      13.7ns ±61%         ~     (p=1.000 n=8+10)
MapInterfacePtr-16                  10.8ns ±29%      11.3ns ±52%         ~     (p=0.684 n=10+10)
NewEmptyMapHintLessThan8-16         6.54ns ± 1%      6.04ns ± 1%       -7.56%  (p=0.000 n=9+9)
NewEmptyMapHintGreaterThan8-16       271ns ± 2%       268ns ± 1%         ~     (p=0.062 n=10+9)
MapPop100-16                        10.8µs ± 6%       7.2µs ±14%      -33.41%  (p=0.000 n=10+10)
MapPop1000-16                        170µs ± 1%       101µs ± 1%      -40.54%  (p=0.000 n=9+9)
MapPop10000-16                      3.35ms ± 3%      1.74ms ± 4%      -48.15%  (p=0.000 n=10+9)
MapAssign/Int32/256-16              10.1ns ± 4%       8.9ns ± 1%      -12.13%  (p=0.000 n=10+9)
MapAssign/Int32/65536-16            22.0ns ± 1%      12.9ns ± 1%      -41.11%  (p=0.000 n=10+8)
MapAssign/Int64/256-16              10.7ns ± 2%       8.6ns ± 2%      -19.79%  (p=0.000 n=8+9)
MapAssign/Int64/65536-16            23.2ns ± 2%      13.1ns ± 2%      -43.39%  (p=0.000 n=10+9)
MapAssign/Str/256-16                16.6ns ± 4%      13.1ns ± 3%      -21.18%  (p=0.000 n=10+9)
MapAssign/Str/65536-16              27.5ns ± 3%      20.5ns ± 3%      -25.66%  (p=0.000 n=10+9)
MapOperatorAssign/Int32/256-16      9.89ns ± 2%      8.69ns ± 3%      -12.15%  (p=0.000 n=9+9)
MapOperatorAssign/Int32/65536-16    21.9ns ± 1%      12.8ns ± 3%      -41.52%  (p=0.000 n=10+10)
MapOperatorAssign/Int64/256-16      10.9ns ± 3%       8.6ns ± 1%      -21.20%  (p=0.000 n=9+8)
MapOperatorAssign/Int64/65536-16    22.4ns ± 0%      13.2ns ± 2%      -41.15%  (p=0.000 n=7+9)
MapOperatorAssign/Str/256-16        1.43µs ± 2%      1.40µs ± 1%       -1.93%  (p=0.000 n=10+10)
MapOperatorAssign/Str/65536-16       234ns ± 3%       237ns ± 4%         ~     (p=0.138 n=10+10)
MapAppendAssign/Int32/256-16        21.0ns ± 2%      20.1ns ± 4%       -4.43%  (p=0.000 n=8+10)
MapAppendAssign/Int32/65536-16      38.5ns ± 2%      33.9ns ± 2%      -12.00%  (p=0.000 n=10+10)
MapAppendAssign/Int64/256-16        21.4ns ± 3%      20.4ns ± 6%       -4.26%  (p=0.008 n=9+10)
MapAppendAssign/Int64/65536-16      39.8ns ± 2%      34.9ns ± 1%      -12.40%  (p=0.000 n=10+8)
MapAppendAssign/Str/256-16          52.8ns ± 7%      52.1ns ± 5%         ~     (p=0.739 n=10+10)
MapAppendAssign/Str/65536-16        66.5ns ± 2%      67.7ns ± 1%       +1.94%  (p=0.004 n=9+9)
MapDelete/Int32/100-16              27.7ns ± 2%      17.8ns ± 2%      -35.77%  (p=0.000 n=10+10)
MapDelete/Int32/1000-16             22.6ns ± 2%      12.8ns ± 1%      -43.31%  (p=0.000 n=9+9)
MapDelete/Int32/10000-16            25.0ns ± 2%      15.2ns ± 1%      -39.33%  (p=0.000 n=7+10)
MapDelete/Int64/100-16              29.8ns ± 3%      17.6ns ± 2%      -40.98%  (p=0.000 n=10+9)
MapDelete/Int64/1000-16             23.3ns ± 2%      13.1ns ± 1%      -43.77%  (p=0.000 n=10+8)
MapDelete/Int64/10000-16            25.6ns ± 2%      16.1ns ± 1%      -37.13%  (p=0.000 n=9+9)
MapDelete/Str/100-16                38.4ns ± 4%      24.8ns ± 2%      -35.29%  (p=0.000 n=10+10)
MapDelete/Str/1000-16               30.8ns ± 2%      20.7ns ± 1%      -32.72%  (p=0.000 n=10+10)
MapDelete/Str/10000-16              35.8ns ± 2%      24.4ns ± 2%      -31.95%  (p=0.000 n=10+10)
MapDelete/Pointer/100-16            30.7ns ± 2%      21.0ns ± 1%      -31.69%  (p=0.000 n=10+10)
MapDelete/Pointer/1000-16           24.5ns ± 2%      16.6ns ± 1%      -32.37%  (p=0.000 n=10+10)
MapDelete/Pointer/10000-16          27.1ns ± 3%      19.8ns ± 2%      -26.87%  (p=0.000 n=10+10)

name old alloc/op new alloc/op delta
NewEmptyMap-16 0.00B 0.00B ~ (all equal)
NewSmallMap-16 0.00B 0.00B ~ (all equal)
MapPopulate/1-16 0.00B 0.00B ~ (all equal)
MapPopulate/10-16 179B ± 0% 176B ± 0% -1.68% (p=0.000 n=10+10)
MapPopulate/100-16 3.35kB ± 0% 2.64kB ± 0% -21.16% (p=0.000 n=10+10)
MapPopulate/1000-16 53.3kB ± 0% 48.7kB ± 0% -8.62% (p=0.000 n=9+10)
MapPopulate/10000-16 428kB ± 0% 368kB ± 0% -13.87% (p=0.000 n=9+10)
MapPopulate/100000-16 3.62MB ± 0% 2.89MB ± 0% -20.08% (p=0.000 n=8+10)
MapStringConversion/32/simple-16 0.00B 0.00B ~ (all equal)
MapStringConversion/32/struct-16 0.00B 0.00B ~ (all equal)
MapStringConversion/32/array-16 0.00B 0.00B ~ (all equal)
MapStringConversion/64/simple-16 0.00B 0.00B ~ (all equal)
MapStringConversion/64/struct-16 0.00B 0.00B ~ (all equal)
MapStringConversion/64/array-16 0.00B 0.00B ~ (all equal)
NewEmptyMapHintLessThan8-16 0.00B 0.00B ~ (all equal)
NewEmptyMapHintGreaterThan8-16 1.15kB ± 0% 1.15kB ± 0% ~ (all equal)
MapAppendAssign/Int32/256-16 45.5B ± 3% 43.5B ±13% ~ (p=0.291 n=8+10)
MapAppendAssign/Int32/65536-16 18.3B ± 4% 16.7B ± 4% -8.74% (p=0.000 n=10+10)
MapAppendAssign/Int64/256-16 42.8B ±12% 44.5B ±15% ~ (p=0.466 n=10+10)
MapAppendAssign/Int64/65536-16 18.6B ± 8% 17.0B ± 0% -8.60% (p=0.000 n=10+9)
MapAppendAssign/Str/256-16 88.1B ± 4% 87.9B ± 4% ~ (p=1.000 n=10+10)
MapAppendAssign/Str/65536-16 35.0B ± 0% 33.4B ± 4% -4.57% (p=0.000 n=6+10)

name old allocs/op new allocs/op delta
NewEmptyMap-16 0.00 0.00 ~ (all equal)
NewSmallMap-16 0.00 0.00 ~ (all equal)
MapPopulate/1-16 0.00 0.00 ~ (all equal)
MapPopulate/10-16 1.00 ± 0% 1.00 ± 0% ~ (all equal)
MapPopulate/100-16 17.0 ± 0% 4.0 ± 0% -76.47% (p=0.000 n=10+10)
MapPopulate/1000-16 72.7 ± 1% 8.0 ± 0% -89.00% (p=0.000 n=10+10)
MapPopulate/10000-16 319 ± 0% 11 ± 0% -96.55% (p=0.002 n=8+10)
MapPopulate/100000-16 4.00k ± 0% 0.01k ± 0% -99.65% (p=0.000 n=10+10)
MapStringConversion/32/simple-16 0.00 0.00 ~ (all equal)
MapStringConversion/32/struct-16 0.00 0.00 ~ (all equal)
MapStringConversion/32/array-16 0.00 0.00 ~ (all equal)
MapStringConversion/64/simple-16 0.00 0.00 ~ (all equal)
MapStringConversion/64/struct-16 0.00 0.00 ~ (all equal)
MapStringConversion/64/array-16 0.00 0.00 ~ (all equal)
NewEmptyMapHintLessThan8-16 0.00 0.00 ~ (all equal)
NewEmptyMapHintGreaterThan8-16 1.00 ± 0% 1.00 ± 0% ~ (all equal)
MapAppendAssign/Int32/256-16 0.00 0.00 ~ (all equal)
MapAppendAssign/Int32/65536-16 0.00 0.00 ~ (all equal)
MapAppendAssign/Int64/256-16 0.00 0.00 ~ (all equal)
MapAppendAssign/Int64/65536-16 0.00 0.00 ~ (all equal)
MapAppendAssign/Str/256-16 0.00 0.00 ~ (all equal)
MapAppendAssign/Str/65536-16 0.00 0.00 ~ (all equal)

gopherbot

gopherbot commented on Aug 30, 2022

@gopherbot
Contributor

Change https://go.dev/cl/426614 mentions this issue: runtime: use SwissTable

seankhliao

seankhliao commented on Aug 30, 2022

@seankhliao
Member

cc @golang/runtime

added
NeedsInvestigationSomeone must examine and confirm this is a valid issue and not a duplicate of an existing one.
on Aug 30, 2022
prattmic

prattmic commented on Aug 30, 2022

@prattmic
Member

cc @randall77

Overall this sounds great. The main concern I have up front here is that growing happens all at once rather than incrementally. Could you explain more why that is and if it is possible to do so incrementally?

aaronbee

aaronbee commented on Aug 30, 2022

@aaronbee

Do iterators get invalidated when the map is modified? This is common for open-addressing hash tables. An important feature of the current map is that you can modify the map while iterating and the iterator still works.

aaronbee

aaronbee commented on Aug 30, 2022

@aaronbee

Do iterators get invalidated when the map is modified? This is common for open-addressing hash tables. An important feature of the current map is that you can modify the map while iterating and the iterator still works.

I checked the implementation and it does look like iterators stay valid when the map is modified.

randall77

randall77 commented on Aug 30, 2022

@randall77
Contributor

The semantics of Go iterators basically mean you can't move items in the map data structure once you've placed them. So, for instance, you can't move a valid item to fill in a deleted one - you need to always use a tombstone. But other than that, iterators don't add much of a restriction to the implementation.

aclements

aclements commented on Aug 31, 2022

@aclements
Member

This is really exciting. Thanks for doing all of this work.

The benchmarks from runtime.

There are many slowdowns in these benchmarks, some quite significant. Do you understand the source of these slowdowns? Is it something that can be fixed?

The previous implementation uses incremental rehash

This is an important property to maintain because it can significantly impact the tail latency of services. We've done a lot of work throughout the Go runtime over the years to avoid unpredictable performance spikes and it would be a shame to regress here.

I'm not personally familiar with the details of SwissTable. Is incremental rehashing something that can be done and just hasn't been implemented yet, or is it fundamentally difficult?

If it's fundamentally difficult to do directly in SwissTable, I've been kickaround the the idea of adopting aspects of extendible hashing for a while, which could be a general solution to incremental resizing. I should probably just file an "idea" issue about this, but I'll try to lay it out here.

The idea is that, once a hash table grows beyond some size threshold based on bounding how long it takes to resize a map, you switch to a two-level scheme. I'm guessing that threshold would be around 4MiB, but that would have to be determined experimentally. In the two-level scheme, the top level is an index array keyed by the top k bits of the hash, which then points to map shards, which are individual SwissTables. The Wikipedia article I linked has some good diagrams for visualizing this. Each shard s contains only the items whose top js <= k bits are all identical, and multiple index entries will point to the same shard if that shard's js < k. When an individual shard overflows the threshold size, you split just that shard into two new shards s1 and s2 with js1 = js2 = js+1, and update the index. If js1 > k, then you also double the index array in order to increase k by 1.

This would enable incremental growth and bound the resize cost paid by any single map operation. Iterators can continue to work while a map is resized by holding on to the pre-resize shard they are currently iterating (let the GC collect this once all iterators have moved past it). It would also reduce overall memory footprint because the total memory size of a map doesn't have to be a power of two (even if each individual shard is). It would result in less memory fragmentation caused by large maps because it limits the size of each individual allocation. And it would address problems with our current map resizing algorithm where, if a map is grown to a size that puts it into resizing mode, but then modifications stop and the application switches to only reading from the map, accesses are relatively slow and the map continues to consume additional memory (#51410).

added this to the Unplanned milestone on Aug 31, 2022

227 remaining items

Loading
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

NeedsFixThe path to resolution is known, but the work has not been done.compiler/runtimeIssues related to the Go compiler and/or runtime.

Type

No type

Projects

Status

Done

Relationships

None yet

    Development

    No branches or pull requests

      Participants

      @josharian@beoran@aaronbee@rabbbit@CAFxX

      Issue actions

        runtime: use SwissTable · Issue #54766 · golang/go