1. 27 Feb, 2019 1 commit
  2. 21 Dec, 2018 1 commit
  3. 08 Nov, 2018 1 commit
  4. 14 Mar, 2018 1 commit
  5. 01 Nov, 2017 1 commit
  6. 27 Sep, 2017 1 commit
  7. 17 May, 2017 1 commit
  8. 10 May, 2017 1 commit
  9. 04 May, 2017 1 commit
  10. 18 Apr, 2017 1 commit
  11. 17 Mar, 2017 1 commit
  12. 15 Mar, 2017 1 commit
    • Bryan C. Mills's avatar
      syncmap: remove blocking for all operations on existing keys · a60ad46e
      Bryan C. Mills authored
      In the previous version, Loads of keys with unchanged values would
      block on the Mutex if the map was dirty, leading to potentially long
      stalls while the read-only map is being copied to the dirty map.
      
      This change adds a double pointer indirection to each entry and an
      extra atomic load on the fast path. In exchange, it removes the need
      to lock the map for nearly all operations on existing keys.
      
      Each entry is represented by an atomically-updated pointer to an
      interface{} value. The same entries are stored in both the read-only
      and dirty maps. Keys deleted before the dirty map was last copied are
      marked as "expunged" and omitted from the dirty map until the next
      Store to that key.
      
      Newly-stored values exist only in the dirty map. The existence of new
      keys in the dirty map is indicated by an "amended" bit attached to the
      read-only map, allowing Load or Delete calls for nonexistent keys to
      sometimes return immediately (without acquiring the Mutex).
      
      This trades off a bit of steady-state throughput in the "mostly hits"
      case in exchange for less contention (and lower Load tail latencies)
      for mixed Load/Store/Delete usage.
      
      Unfortunately, the latency impact is currently difficult to measure
      (#19128).
      
      updates golang/go#19128
      updates golang/go#18177
      
      https://perf.golang.org/search?q=upload:20170315.5
      
      name                                               old time/op    new time/op    delta
      LoadMostlyHits/*syncmap_test.DeepCopyMap             70.3ns ± 6%    70.2ns ± 4%      ~     (p=0.886 n=4+4)
      LoadMostlyHits/*syncmap_test.DeepCopyMap-48          10.9ns ± 4%    13.6ns ±24%      ~     (p=0.314 n=4+4)
      LoadMostlyHits/*syncmap_test.RWMutexMap              86.0ns ± 9%    86.0ns ± 4%      ~     (p=1.000 n=4+4)
      LoadMostlyHits/*syncmap_test.RWMutexMap-48            140ns ± 3%     139ns ± 2%      ~     (p=0.686 n=4+4)
      LoadMostlyHits/*syncmap.Map                          70.6ns ± 8%    70.3ns ± 1%      ~     (p=0.571 n=4+4)
      LoadMostlyHits/*syncmap.Map-48                       10.3ns ± 7%    11.2ns ± 5%      ~     (p=0.114 n=4+4)
      LoadMostlyMisses/*syncmap_test.DeepCopyMap           59.4ns ± 4%    59.4ns ± 4%      ~     (p=1.000 n=4+4)
      LoadMostlyMisses/*syncmap_test.DeepCopyMap-48        10.4ns ±30%    12.6ns ±29%      ~     (p=0.486 n=4+4)
      LoadMostlyMisses/*syncmap_test.RWMutexMap            64.8ns ± 6%    63.8ns ± 4%      ~     (p=0.686 n=4+4)
      LoadMostlyMisses/*syncmap_test.RWMutexMap-48          138ns ± 3%     139ns ± 2%      ~     (p=0.800 n=4+4)
      LoadMostlyMisses/*syncmap.Map                        51.5ns ± 7%    50.4ns ± 2%      ~     (p=0.371 n=4+4)
      LoadMostlyMisses/*syncmap.Map-48                     9.37ns ± 3%    9.40ns ± 3%      ~     (p=0.886 n=4+4)
      LoadOrStoreBalanced/*syncmap_test.RWMutexMap          820ns ±17%     834ns ±14%      ~     (p=1.000 n=4+4)
      LoadOrStoreBalanced/*syncmap_test.RWMutexMap-48      1.38µs ± 4%    1.38µs ± 3%      ~     (p=0.886 n=4+4)
      LoadOrStoreBalanced/*syncmap.Map                      709ns ±13%    1085ns ± 9%   +53.09%  (p=0.029 n=4+4)
      LoadOrStoreBalanced/*syncmap.Map-48                  1.30µs ±13%    1.08µs ± 8%   -17.40%  (p=0.029 n=4+4)
      LoadOrStoreUnique/*syncmap_test.RWMutexMap           1.26µs ±14%    1.16µs ±29%      ~     (p=0.343 n=4+4)
      LoadOrStoreUnique/*syncmap_test.RWMutexMap-48        1.82µs ±15%    1.98µs ± 6%      ~     (p=0.143 n=4+4)
      LoadOrStoreUnique/*syncmap.Map                       1.06µs ± 7%    1.86µs ±11%   +76.09%  (p=0.029 n=4+4)
      LoadOrStoreUnique/*syncmap.Map-48                    2.00µs ± 4%    1.62µs ± 4%   -19.20%  (p=0.029 n=4+4)
      LoadOrStoreCollision/*syncmap_test.DeepCopyMap       32.9ns ± 8%    32.6ns ± 9%      ~     (p=0.686 n=4+4)
      LoadOrStoreCollision/*syncmap_test.DeepCopyMap-48   2.26ns ±136%    3.41ns ±62%      ~     (p=0.114 n=4+4)
      LoadOrStoreCollision/*syncmap_test.RWMutexMap        58.0ns ±20%    54.6ns ±17%      ~     (p=0.343 n=4+4)
      LoadOrStoreCollision/*syncmap_test.RWMutexMap-48      458ns ± 2%     445ns ± 6%      ~     (p=0.229 n=4+4)
      LoadOrStoreCollision/*syncmap.Map                    35.8ns ± 5%    39.6ns ± 9%      ~     (p=0.114 n=4+4)
      LoadOrStoreCollision/*syncmap.Map-48                 1.24ns ± 2%    1.58ns ± 4%   +27.16%  (p=0.029 n=4+4)
      Range/*syncmap_test.DeepCopyMap                      19.7µs ± 4%    19.8µs ± 3%      ~     (p=0.686 n=4+4)
      Range/*syncmap_test.DeepCopyMap-48                    763ns ± 1%     864ns ± 3%   +13.24%  (p=0.029 n=4+4)
      Range/*syncmap_test.RWMutexMap                       20.9µs ± 3%    20.4µs ± 4%      ~     (p=0.343 n=4+4)
      Range/*syncmap_test.RWMutexMap-48                     764ns ± 1%     870ns ± 1%   +13.77%  (p=0.029 n=4+4)
      Range/*syncmap.Map                                   20.4µs ± 5%    22.7µs ± 5%   +10.98%  (p=0.029 n=4+4)
      Range/*syncmap.Map-48                                 776ns ± 3%     954ns ± 4%   +22.95%  (p=0.029 n=4+4)
      AdversarialAlloc/*syncmap_test.DeepCopyMap            206ns ± 5%     199ns ± 2%      ~     (p=0.200 n=4+4)
      AdversarialAlloc/*syncmap_test.DeepCopyMap-48        8.94µs ± 5%    9.21µs ± 4%      ~     (p=0.200 n=4+4)
      AdversarialAlloc/*syncmap_test.RWMutexMap            63.4ns ± 4%    63.8ns ± 3%      ~     (p=0.686 n=4+4)
      AdversarialAlloc/*syncmap_test.RWMutexMap-48          184ns ±10%     198ns ±11%      ~     (p=0.343 n=4+4)
      AdversarialAlloc/*syncmap.Map                         213ns ± 3%     264ns ± 3%   +23.97%  (p=0.029 n=4+4)
      AdversarialAlloc/*syncmap.Map-48                      556ns ± 5%    1389ns ± 8%  +149.93%  (p=0.029 n=4+4)
      AdversarialDelete/*syncmap_test.DeepCopyMap           300ns ± 6%     304ns ± 7%      ~     (p=0.886 n=4+4)
      AdversarialDelete/*syncmap_test.DeepCopyMap-48        647ns ± 3%     646ns ± 3%      ~     (p=0.943 n=4+4)
      AdversarialDelete/*syncmap_test.RWMutexMap           69.1ns ± 1%    69.2ns ± 6%      ~     (p=0.686 n=4+4)
      AdversarialDelete/*syncmap_test.RWMutexMap-48         289ns ±15%     300ns ±17%      ~     (p=0.829 n=4+4)
      AdversarialDelete/*syncmap.Map                        198ns ± 5%     264ns ± 2%   +33.17%  (p=0.029 n=4+4)
      AdversarialDelete/*syncmap.Map-48                     291ns ± 9%     173ns ± 8%   -40.50%  (p=0.029 n=4+4)
      
      name                                               old alloc/op   new alloc/op   delta
      LoadMostlyHits/*syncmap_test.DeepCopyMap              7.00B ± 0%     7.00B ± 0%      ~     (all equal)
      LoadMostlyHits/*syncmap_test.DeepCopyMap-48           7.00B ± 0%     7.00B ± 0%      ~     (all equal)
      LoadMostlyHits/*syncmap_test.RWMutexMap               7.00B ± 0%     7.00B ± 0%      ~     (all equal)
      LoadMostlyHits/*syncmap_test.RWMutexMap-48            7.00B ± 0%     7.00B ± 0%      ~     (all equal)
      LoadMostlyHits/*syncmap.Map                           7.00B ± 0%     7.00B ± 0%      ~     (all equal)
      LoadMostlyHits/*syncmap.Map-48                        7.00B ± 0%     7.00B ± 0%      ~     (all equal)
      LoadMostlyMisses/*syncmap_test.DeepCopyMap            7.00B ± 0%     7.00B ± 0%      ~     (all equal)
      LoadMostlyMisses/*syncmap_test.DeepCopyMap-48         7.00B ± 0%     7.00B ± 0%      ~     (all equal)
      LoadMostlyMisses/*syncmap_test.RWMutexMap             7.00B ± 0%     7.00B ± 0%      ~     (all equal)
      LoadMostlyMisses/*syncmap_test.RWMutexMap-48          7.00B ± 0%     7.00B ± 0%      ~     (all equal)
      LoadMostlyMisses/*syncmap.Map                         7.00B ± 0%     7.00B ± 0%      ~     (all equal)
      LoadMostlyMisses/*syncmap.Map-48                      7.00B ± 0%     7.00B ± 0%      ~     (all equal)
      LoadOrStoreBalanced/*syncmap_test.RWMutexMap          95.0B ± 0%     95.0B ± 0%      ~     (all equal)
      LoadOrStoreBalanced/*syncmap_test.RWMutexMap-48       95.0B ± 0%     95.0B ± 0%      ~     (all equal)
      LoadOrStoreBalanced/*syncmap.Map                      95.0B ± 0%     88.0B ± 0%    -7.37%  (p=0.029 n=4+4)
      LoadOrStoreBalanced/*syncmap.Map-48                   95.0B ± 0%     88.0B ± 0%    -7.37%  (p=0.029 n=4+4)
      LoadOrStoreUnique/*syncmap_test.RWMutexMap             175B ± 0%      175B ± 0%      ~     (all equal)
      LoadOrStoreUnique/*syncmap_test.RWMutexMap-48          175B ± 0%      175B ± 0%      ~     (all equal)
      LoadOrStoreUnique/*syncmap.Map                         175B ± 0%      161B ± 0%    -8.00%  (p=0.029 n=4+4)
      LoadOrStoreUnique/*syncmap.Map-48                      175B ± 0%      161B ± 0%    -8.00%  (p=0.029 n=4+4)
      LoadOrStoreCollision/*syncmap_test.DeepCopyMap        0.00B          0.00B           ~     (all equal)
      LoadOrStoreCollision/*syncmap_test.DeepCopyMap-48     0.00B          0.00B           ~     (all equal)
      LoadOrStoreCollision/*syncmap_test.RWMutexMap         0.00B          0.00B           ~     (all equal)
      LoadOrStoreCollision/*syncmap_test.RWMutexMap-48      0.00B          0.00B           ~     (all equal)
      LoadOrStoreCollision/*syncmap.Map                     0.00B          0.00B           ~     (all equal)
      LoadOrStoreCollision/*syncmap.Map-48                  0.00B          0.00B           ~     (all equal)
      Range/*syncmap_test.DeepCopyMap                       0.00B          0.00B           ~     (all equal)
      Range/*syncmap_test.DeepCopyMap-48                    0.00B          0.00B           ~     (all equal)
      Range/*syncmap_test.RWMutexMap                        0.00B          0.00B           ~     (all equal)
      Range/*syncmap_test.RWMutexMap-48                     0.00B          0.00B           ~     (all equal)
      Range/*syncmap.Map                                    0.00B          0.00B           ~     (all equal)
      Range/*syncmap.Map-48                                 0.00B          0.00B           ~     (all equal)
      AdversarialAlloc/*syncmap_test.DeepCopyMap            74.0B ± 0%     74.0B ± 0%      ~     (all equal)
      AdversarialAlloc/*syncmap_test.DeepCopyMap-48        3.15kB ± 0%    3.15kB ± 0%      ~     (p=1.000 n=4+4)
      AdversarialAlloc/*syncmap_test.RWMutexMap             8.00B ± 0%     8.00B ± 0%      ~     (all equal)
      AdversarialAlloc/*syncmap_test.RWMutexMap-48          8.00B ± 0%     8.00B ± 0%      ~     (all equal)
      AdversarialAlloc/*syncmap.Map                         74.0B ± 0%     55.0B ± 0%   -25.68%  (p=0.029 n=4+4)
      AdversarialAlloc/*syncmap.Map-48                      8.00B ± 0%    56.25B ± 1%  +603.12%  (p=0.029 n=4+4)
      AdversarialDelete/*syncmap_test.DeepCopyMap            155B ± 0%      155B ± 0%      ~     (all equal)
      AdversarialDelete/*syncmap_test.DeepCopyMap-48         156B ± 0%      156B ± 0%      ~     (p=1.000 n=4+4)
      AdversarialDelete/*syncmap_test.RWMutexMap            8.00B ± 0%     8.00B ± 0%      ~     (all equal)
      AdversarialDelete/*syncmap_test.RWMutexMap-48         8.00B ± 0%     8.00B ± 0%      ~     (all equal)
      AdversarialDelete/*syncmap.Map                        81.0B ± 0%     65.0B ± 0%   -19.75%  (p=0.029 n=4+4)
      AdversarialDelete/*syncmap.Map-48                     23.0B ± 9%     15.2B ± 5%   -33.70%  (p=0.029 n=4+4)
      
      name                                               old allocs/op  new allocs/op  delta
      LoadMostlyHits/*syncmap_test.DeepCopyMap               0.00           0.00           ~     (all equal)
      LoadMostlyHits/*syncmap_test.DeepCopyMap-48            0.00           0.00           ~     (all equal)
      LoadMostlyHits/*syncmap_test.RWMutexMap                0.00           0.00           ~     (all equal)
      LoadMostlyHits/*syncmap_test.RWMutexMap-48             0.00           0.00           ~     (all equal)
      LoadMostlyHits/*syncmap.Map                            0.00           0.00           ~     (all equal)
      LoadMostlyHits/*syncmap.Map-48                         0.00           0.00           ~     (all equal)
      LoadMostlyMisses/*syncmap_test.DeepCopyMap             0.00           0.00           ~     (all equal)
      LoadMostlyMisses/*syncmap_test.DeepCopyMap-48          0.00           0.00           ~     (all equal)
      LoadMostlyMisses/*syncmap_test.RWMutexMap              0.00           0.00           ~     (all equal)
      LoadMostlyMisses/*syncmap_test.RWMutexMap-48           0.00           0.00           ~     (all equal)
      LoadMostlyMisses/*syncmap.Map                          0.00           0.00           ~     (all equal)
      LoadMostlyMisses/*syncmap.Map-48                       0.00           0.00           ~     (all equal)
      LoadOrStoreBalanced/*syncmap_test.RWMutexMap           2.00 ± 0%      2.00 ± 0%      ~     (all equal)
      LoadOrStoreBalanced/*syncmap_test.RWMutexMap-48        2.00 ± 0%      2.00 ± 0%      ~     (all equal)
      LoadOrStoreBalanced/*syncmap.Map                       2.00 ± 0%      3.00 ± 0%   +50.00%  (p=0.029 n=4+4)
      LoadOrStoreBalanced/*syncmap.Map-48                    2.00 ± 0%      3.00 ± 0%   +50.00%  (p=0.029 n=4+4)
      LoadOrStoreUnique/*syncmap_test.RWMutexMap             2.00 ± 0%      2.00 ± 0%      ~     (all equal)
      LoadOrStoreUnique/*syncmap_test.RWMutexMap-48          2.00 ± 0%      2.00 ± 0%      ~     (all equal)
      LoadOrStoreUnique/*syncmap.Map                         2.00 ± 0%      4.00 ± 0%  +100.00%  (p=0.029 n=4+4)
      LoadOrStoreUnique/*syncmap.Map-48                      2.00 ± 0%      4.00 ± 0%  +100.00%  (p=0.029 n=4+4)
      LoadOrStoreCollision/*syncmap_test.DeepCopyMap         0.00           0.00           ~     (all equal)
      LoadOrStoreCollision/*syncmap_test.DeepCopyMap-48      0.00           0.00           ~     (all equal)
      LoadOrStoreCollision/*syncmap_test.RWMutexMap          0.00           0.00           ~     (all equal)
      LoadOrStoreCollision/*syncmap_test.RWMutexMap-48       0.00           0.00           ~     (all equal)
      LoadOrStoreCollision/*syncmap.Map                      0.00           0.00           ~     (all equal)
      LoadOrStoreCollision/*syncmap.Map-48                   0.00           0.00           ~     (all equal)
      Range/*syncmap_test.DeepCopyMap                        0.00           0.00           ~     (all equal)
      Range/*syncmap_test.DeepCopyMap-48                     0.00           0.00           ~     (all equal)
      Range/*syncmap_test.RWMutexMap                         0.00           0.00           ~     (all equal)
      Range/*syncmap_test.RWMutexMap-48                      0.00           0.00           ~     (all equal)
      Range/*syncmap.Map                                     0.00           0.00           ~     (all equal)
      Range/*syncmap.Map-48                                  0.00           0.00           ~     (all equal)
      AdversarialAlloc/*syncmap_test.DeepCopyMap             1.00 ± 0%      1.00 ± 0%      ~     (all equal)
      AdversarialAlloc/*syncmap_test.DeepCopyMap-48          1.00 ± 0%      1.00 ± 0%      ~     (all equal)
      AdversarialAlloc/*syncmap_test.RWMutexMap              1.00 ± 0%      1.00 ± 0%      ~     (all equal)
      AdversarialAlloc/*syncmap_test.RWMutexMap-48           1.00 ± 0%      1.00 ± 0%      ~     (all equal)
      AdversarialAlloc/*syncmap.Map                          1.00 ± 0%      1.00 ± 0%      ~     (all equal)
      AdversarialAlloc/*syncmap.Map-48                       1.00 ± 0%      1.00 ± 0%      ~     (all equal)
      AdversarialDelete/*syncmap_test.DeepCopyMap            1.00 ± 0%      1.00 ± 0%      ~     (all equal)
      AdversarialDelete/*syncmap_test.DeepCopyMap-48         1.00 ± 0%      1.00 ± 0%      ~     (all equal)
      AdversarialDelete/*syncmap_test.RWMutexMap             1.00 ± 0%      1.00 ± 0%      ~     (all equal)
      AdversarialDelete/*syncmap_test.RWMutexMap-48          1.00 ± 0%      1.00 ± 0%      ~     (all equal)
      AdversarialDelete/*syncmap.Map                         1.00 ± 0%      1.00 ± 0%      ~     (all equal)
      AdversarialDelete/*syncmap.Map-48                      1.00 ± 0%      1.00 ± 0%      ~     (all equal)
      
      Change-Id: I93c9458505d84238cc8e9016a7dfd285868af236
      Reviewed-on: https://go-review.googlesource.com/37342Reviewed-by: 's avatarRuss Cox <rsc@golang.org>
      a60ad46e
  13. 16 Feb, 2017 2 commits
  14. 15 Feb, 2017 1 commit
    • Bryan C. Mills's avatar
      syncmap: add a synchronized map implementation. · 54b13b0b
      Bryan C. Mills authored
      This is a draft for the sync.Map API proposed in golang/go#18177.
      
      It supports fast-path loads via an atomic variable, falling back to a
      Mutex for stores. In order to keep stores amortized to O(1), loads
      following a store follow the Mutex path until enough loads have
      occurred to offset the cost of a deep copy.
      
      For mostly-read loads, such as the maps in the reflect package in the
      standard library, this significantly reduces cache-line contention vs.
      a plain RWMutex with a map.
      
      goos: linux
      goarch: amd64
      pkg: golang.org/x/sync/syncmap
      BenchmarkLoadMostlyHits/*syncmap_test.DeepCopyMap               20000000                73.1 ns/op
      BenchmarkLoadMostlyHits/*syncmap_test.DeepCopyMap-48            100000000               13.8 ns/op
      BenchmarkLoadMostlyHits/*syncmap_test.RWMutexMap                20000000                87.7 ns/op
      BenchmarkLoadMostlyHits/*syncmap_test.RWMutexMap-48             10000000               154 ns/op
      BenchmarkLoadMostlyHits/*syncmap.Map                            20000000                72.1 ns/op
      BenchmarkLoadMostlyHits/*syncmap.Map-48                         100000000               11.2 ns/op
      BenchmarkLoadMostlyMisses/*syncmap_test.DeepCopyMap             20000000                63.2 ns/op
      BenchmarkLoadMostlyMisses/*syncmap_test.DeepCopyMap-48          200000000               14.2 ns/op
      BenchmarkLoadMostlyMisses/*syncmap_test.RWMutexMap              20000000                72.7 ns/op
      BenchmarkLoadMostlyMisses/*syncmap_test.RWMutexMap-48           10000000               150 ns/op
      BenchmarkLoadMostlyMisses/*syncmap.Map                          30000000                56.4 ns/op
      BenchmarkLoadMostlyMisses/*syncmap.Map-48                       200000000                9.77 ns/op
      BenchmarkLoadOrStoreBalanced/*syncmap_test.RWMutexMap            2000000               683 ns/op
      BenchmarkLoadOrStoreBalanced/*syncmap_test.RWMutexMap-48         1000000              1394 ns/op
      BenchmarkLoadOrStoreBalanced/*syncmap.Map                        2000000               645 ns/op
      BenchmarkLoadOrStoreBalanced/*syncmap.Map-48                     1000000              1253 ns/op
      BenchmarkLoadOrStoreUnique/*syncmap_test.RWMutexMap              1000000              1015 ns/op
      BenchmarkLoadOrStoreUnique/*syncmap_test.RWMutexMap-48           1000000              1911 ns/op
      BenchmarkLoadOrStoreUnique/*syncmap.Map                          1000000              1018 ns/op
      BenchmarkLoadOrStoreUnique/*syncmap.Map-48                       1000000              1776 ns/op
      BenchmarkLoadOrStoreCollision/*syncmap_test.DeepCopyMap         50000000                30.2 ns/op
      BenchmarkLoadOrStoreCollision/*syncmap_test.DeepCopyMap-48      2000000000               1.24 ns/op
      BenchmarkLoadOrStoreCollision/*syncmap_test.RWMutexMap          30000000                50.1 ns/op
      BenchmarkLoadOrStoreCollision/*syncmap_test.RWMutexMap-48        5000000               451 ns/op
      BenchmarkLoadOrStoreCollision/*syncmap.Map                      30000000                36.8 ns/op
      BenchmarkLoadOrStoreCollision/*syncmap.Map-48                   2000000000               1.24 ns/op
      BenchmarkAdversarialAlloc/*syncmap_test.DeepCopyMap             10000000               213 ns/op
      BenchmarkAdversarialAlloc/*syncmap_test.DeepCopyMap-48           1000000              5012 ns/op
      BenchmarkAdversarialAlloc/*syncmap_test.RWMutexMap              20000000                68.8 ns/op
      BenchmarkAdversarialAlloc/*syncmap_test.RWMutexMap-48            5000000               429 ns/op
      BenchmarkAdversarialAlloc/*syncmap.Map                           5000000               229 ns/op
      BenchmarkAdversarialAlloc/*syncmap.Map-48                        2000000               600 ns/op
      BenchmarkAdversarialDelete/*syncmap_test.DeepCopyMap             5000000               314 ns/op
      BenchmarkAdversarialDelete/*syncmap_test.DeepCopyMap-48          2000000               726 ns/op
      BenchmarkAdversarialDelete/*syncmap_test.RWMutexMap             20000000                63.2 ns/op
      BenchmarkAdversarialDelete/*syncmap_test.RWMutexMap-48           5000000               469 ns/op
      BenchmarkAdversarialDelete/*syncmap.Map                         10000000               203 ns/op
      BenchmarkAdversarialDelete/*syncmap.Map-48                      10000000               253 ns/op
      
      goos: linux
      goarch: ppc64le
      pkg: golang.org/x/sync/syncmap
      BenchmarkLoadMostlyHits/*syncmap_test.DeepCopyMap                5000000               253 ns/op
      BenchmarkLoadMostlyHits/*syncmap_test.DeepCopyMap-48            50000000                26.2 ns/op
      BenchmarkLoadMostlyHits/*syncmap_test.RWMutexMap                 5000000               505 ns/op
      BenchmarkLoadMostlyHits/*syncmap_test.RWMutexMap-48              3000000               443 ns/op
      BenchmarkLoadMostlyHits/*syncmap.Map                            10000000               200 ns/op
      BenchmarkLoadMostlyHits/*syncmap.Map-48                         100000000               18.1 ns/op
      BenchmarkLoadMostlyMisses/*syncmap_test.DeepCopyMap             10000000               162 ns/op
      BenchmarkLoadMostlyMisses/*syncmap_test.DeepCopyMap-48          100000000               23.8 ns/op
      BenchmarkLoadMostlyMisses/*syncmap_test.RWMutexMap              10000000               195 ns/op
      BenchmarkLoadMostlyMisses/*syncmap_test.RWMutexMap-48            3000000               531 ns/op
      BenchmarkLoadMostlyMisses/*syncmap.Map                          10000000               182 ns/op
      BenchmarkLoadMostlyMisses/*syncmap.Map-48                       100000000               15.8 ns/op
      BenchmarkLoadOrStoreBalanced/*syncmap_test.RWMutexMap            1000000              1664 ns/op
      BenchmarkLoadOrStoreBalanced/*syncmap_test.RWMutexMap-48         1000000              1768 ns/op
      BenchmarkLoadOrStoreBalanced/*syncmap.Map                        1000000              2128 ns/op
      BenchmarkLoadOrStoreBalanced/*syncmap.Map-48                     1000000              1903 ns/op
      BenchmarkLoadOrStoreUnique/*syncmap_test.RWMutexMap              1000000              2657 ns/op
      BenchmarkLoadOrStoreUnique/*syncmap_test.RWMutexMap-48           1000000              2577 ns/op
      BenchmarkLoadOrStoreUnique/*syncmap.Map                          1000000              1714 ns/op
      BenchmarkLoadOrStoreUnique/*syncmap.Map-48                       1000000              2484 ns/op
      BenchmarkLoadOrStoreCollision/*syncmap_test.DeepCopyMap         10000000               130 ns/op
      BenchmarkLoadOrStoreCollision/*syncmap_test.DeepCopyMap-48      100000000               11.3 ns/op
      BenchmarkLoadOrStoreCollision/*syncmap_test.RWMutexMap           3000000               426 ns/op
      BenchmarkLoadOrStoreCollision/*syncmap_test.RWMutexMap-48        2000000               930 ns/op
      BenchmarkLoadOrStoreCollision/*syncmap.Map                      10000000               131 ns/op
      BenchmarkLoadOrStoreCollision/*syncmap.Map-48                   300000000                4.07 ns/op
      BenchmarkAdversarialAlloc/*syncmap_test.DeepCopyMap              3000000               447 ns/op
      BenchmarkAdversarialAlloc/*syncmap_test.DeepCopyMap-48            300000              4159 ns/op
      BenchmarkAdversarialAlloc/*syncmap_test.RWMutexMap              10000000               191 ns/op
      BenchmarkAdversarialAlloc/*syncmap_test.RWMutexMap-48            3000000               535 ns/op
      BenchmarkAdversarialAlloc/*syncmap.Map                           2000000               525 ns/op
      BenchmarkAdversarialAlloc/*syncmap.Map-48                        1000000              1000 ns/op
      BenchmarkAdversarialDelete/*syncmap_test.DeepCopyMap             2000000               711 ns/op
      BenchmarkAdversarialDelete/*syncmap_test.DeepCopyMap-48          2000000               900 ns/op
      BenchmarkAdversarialDelete/*syncmap_test.RWMutexMap              3000000               354 ns/op
      BenchmarkAdversarialDelete/*syncmap_test.RWMutexMap-48           3000000               473 ns/op
      BenchmarkAdversarialDelete/*syncmap.Map                          2000000              1357 ns/op
      BenchmarkAdversarialDelete/*syncmap.Map-48                       5000000               334 ns/op
      
      Updates golang/go#18177
      
      Change-Id: I8d561b617b1cd2ca03a8e68a5d5a28a519a0ce38
      Reviewed-on: https://go-review.googlesource.com/33912Reviewed-by: 's avatarRuss Cox <rsc@golang.org>
      54b13b0b
  15. 06 Dec, 2016 1 commit
  16. 01 Dec, 2016 1 commit
  17. 04 Oct, 2016 1 commit
  18. 15 Jul, 2016 3 commits
  19. 13 Jul, 2016 1 commit
  20. 30 Oct, 2015 1 commit