)]}'
{
  "commit": "a60ad46e0ed33d02e09bda439efaf9c9727dbc6c",
  "tree": "d8a9466758309c17d74dc23cbca659c26b2f280a",
  "parents": [
    "86ddc858aa39d0f6cccccd733e482ddc52b852e9"
  ],
  "author": {
    "name": "Bryan C. Mills",
    "email": "bcmills@google.com",
    "time": "Thu Feb 16 13:55:22 2017 -0500"
  },
  "committer": {
    "name": "Bryan Mills",
    "email": "bcmills@google.com",
    "time": "Wed Mar 15 18:56:49 2017 +0000"
  },
  "message": "syncmap: remove blocking for all operations on existing keys\n\nIn the previous version, Loads of keys with unchanged values would\nblock on the Mutex if the map was dirty, leading to potentially long\nstalls while the read-only map is being copied to the dirty map.\n\nThis change adds a double pointer indirection to each entry and an\nextra atomic load on the fast path. In exchange, it removes the need\nto lock the map for nearly all operations on existing keys.\n\nEach entry is represented by an atomically-updated pointer to an\ninterface{} value. The same entries are stored in both the read-only\nand dirty maps. Keys deleted before the dirty map was last copied are\nmarked as \"expunged\" and omitted from the dirty map until the next\nStore to that key.\n\nNewly-stored values exist only in the dirty map. The existence of new\nkeys in the dirty map is indicated by an \"amended\" bit attached to the\nread-only map, allowing Load or Delete calls for nonexistent keys to\nsometimes return immediately (without acquiring the Mutex).\n\nThis trades off a bit of steady-state throughput in the \"mostly hits\"\ncase in exchange for less contention (and lower Load tail latencies)\nfor mixed Load/Store/Delete usage.\n\nUnfortunately, the latency impact is currently difficult to measure\n(#19128).\n\nupdates golang/go#19128\nupdates golang/go#18177\n\nhttps://perf.golang.org/search?q\u003dupload:20170315.5\n\nname                                               old time/op    new time/op    delta\nLoadMostlyHits/*syncmap_test.DeepCopyMap             70.3ns ± 6%    70.2ns ± 4%      ~     (p\u003d0.886 n\u003d4+4)\nLoadMostlyHits/*syncmap_test.DeepCopyMap-48          10.9ns ± 4%    13.6ns ±24%      ~     (p\u003d0.314 n\u003d4+4)\nLoadMostlyHits/*syncmap_test.RWMutexMap              86.0ns ± 9%    86.0ns ± 4%      ~     (p\u003d1.000 n\u003d4+4)\nLoadMostlyHits/*syncmap_test.RWMutexMap-48            140ns ± 3%     139ns ± 2%      ~     (p\u003d0.686 n\u003d4+4)\nLoadMostlyHits/*syncmap.Map                          70.6ns ± 8%    70.3ns ± 1%      ~     (p\u003d0.571 n\u003d4+4)\nLoadMostlyHits/*syncmap.Map-48                       10.3ns ± 7%    11.2ns ± 5%      ~     (p\u003d0.114 n\u003d4+4)\nLoadMostlyMisses/*syncmap_test.DeepCopyMap           59.4ns ± 4%    59.4ns ± 4%      ~     (p\u003d1.000 n\u003d4+4)\nLoadMostlyMisses/*syncmap_test.DeepCopyMap-48        10.4ns ±30%    12.6ns ±29%      ~     (p\u003d0.486 n\u003d4+4)\nLoadMostlyMisses/*syncmap_test.RWMutexMap            64.8ns ± 6%    63.8ns ± 4%      ~     (p\u003d0.686 n\u003d4+4)\nLoadMostlyMisses/*syncmap_test.RWMutexMap-48          138ns ± 3%     139ns ± 2%      ~     (p\u003d0.800 n\u003d4+4)\nLoadMostlyMisses/*syncmap.Map                        51.5ns ± 7%    50.4ns ± 2%      ~     (p\u003d0.371 n\u003d4+4)\nLoadMostlyMisses/*syncmap.Map-48                     9.37ns ± 3%    9.40ns ± 3%      ~     (p\u003d0.886 n\u003d4+4)\nLoadOrStoreBalanced/*syncmap_test.RWMutexMap          820ns ±17%     834ns ±14%      ~     (p\u003d1.000 n\u003d4+4)\nLoadOrStoreBalanced/*syncmap_test.RWMutexMap-48      1.38µs ± 4%    1.38µs ± 3%      ~     (p\u003d0.886 n\u003d4+4)\nLoadOrStoreBalanced/*syncmap.Map                      709ns ±13%    1085ns ± 9%   +53.09%  (p\u003d0.029 n\u003d4+4)\nLoadOrStoreBalanced/*syncmap.Map-48                  1.30µs ±13%    1.08µs ± 8%   -17.40%  (p\u003d0.029 n\u003d4+4)\nLoadOrStoreUnique/*syncmap_test.RWMutexMap           1.26µs ±14%    1.16µs ±29%      ~     (p\u003d0.343 n\u003d4+4)\nLoadOrStoreUnique/*syncmap_test.RWMutexMap-48        1.82µs ±15%    1.98µs ± 6%      ~     (p\u003d0.143 n\u003d4+4)\nLoadOrStoreUnique/*syncmap.Map                       1.06µs ± 7%    1.86µs ±11%   +76.09%  (p\u003d0.029 n\u003d4+4)\nLoadOrStoreUnique/*syncmap.Map-48                    2.00µs ± 4%    1.62µs ± 4%   -19.20%  (p\u003d0.029 n\u003d4+4)\nLoadOrStoreCollision/*syncmap_test.DeepCopyMap       32.9ns ± 8%    32.6ns ± 9%      ~     (p\u003d0.686 n\u003d4+4)\nLoadOrStoreCollision/*syncmap_test.DeepCopyMap-48   2.26ns ±136%    3.41ns ±62%      ~     (p\u003d0.114 n\u003d4+4)\nLoadOrStoreCollision/*syncmap_test.RWMutexMap        58.0ns ±20%    54.6ns ±17%      ~     (p\u003d0.343 n\u003d4+4)\nLoadOrStoreCollision/*syncmap_test.RWMutexMap-48      458ns ± 2%     445ns ± 6%      ~     (p\u003d0.229 n\u003d4+4)\nLoadOrStoreCollision/*syncmap.Map                    35.8ns ± 5%    39.6ns ± 9%      ~     (p\u003d0.114 n\u003d4+4)\nLoadOrStoreCollision/*syncmap.Map-48                 1.24ns ± 2%    1.58ns ± 4%   +27.16%  (p\u003d0.029 n\u003d4+4)\nRange/*syncmap_test.DeepCopyMap                      19.7µs ± 4%    19.8µs ± 3%      ~     (p\u003d0.686 n\u003d4+4)\nRange/*syncmap_test.DeepCopyMap-48                    763ns ± 1%     864ns ± 3%   +13.24%  (p\u003d0.029 n\u003d4+4)\nRange/*syncmap_test.RWMutexMap                       20.9µs ± 3%    20.4µs ± 4%      ~     (p\u003d0.343 n\u003d4+4)\nRange/*syncmap_test.RWMutexMap-48                     764ns ± 1%     870ns ± 1%   +13.77%  (p\u003d0.029 n\u003d4+4)\nRange/*syncmap.Map                                   20.4µs ± 5%    22.7µs ± 5%   +10.98%  (p\u003d0.029 n\u003d4+4)\nRange/*syncmap.Map-48                                 776ns ± 3%     954ns ± 4%   +22.95%  (p\u003d0.029 n\u003d4+4)\nAdversarialAlloc/*syncmap_test.DeepCopyMap            206ns ± 5%     199ns ± 2%      ~     (p\u003d0.200 n\u003d4+4)\nAdversarialAlloc/*syncmap_test.DeepCopyMap-48        8.94µs ± 5%    9.21µs ± 4%      ~     (p\u003d0.200 n\u003d4+4)\nAdversarialAlloc/*syncmap_test.RWMutexMap            63.4ns ± 4%    63.8ns ± 3%      ~     (p\u003d0.686 n\u003d4+4)\nAdversarialAlloc/*syncmap_test.RWMutexMap-48          184ns ±10%     198ns ±11%      ~     (p\u003d0.343 n\u003d4+4)\nAdversarialAlloc/*syncmap.Map                         213ns ± 3%     264ns ± 3%   +23.97%  (p\u003d0.029 n\u003d4+4)\nAdversarialAlloc/*syncmap.Map-48                      556ns ± 5%    1389ns ± 8%  +149.93%  (p\u003d0.029 n\u003d4+4)\nAdversarialDelete/*syncmap_test.DeepCopyMap           300ns ± 6%     304ns ± 7%      ~     (p\u003d0.886 n\u003d4+4)\nAdversarialDelete/*syncmap_test.DeepCopyMap-48        647ns ± 3%     646ns ± 3%      ~     (p\u003d0.943 n\u003d4+4)\nAdversarialDelete/*syncmap_test.RWMutexMap           69.1ns ± 1%    69.2ns ± 6%      ~     (p\u003d0.686 n\u003d4+4)\nAdversarialDelete/*syncmap_test.RWMutexMap-48         289ns ±15%     300ns ±17%      ~     (p\u003d0.829 n\u003d4+4)\nAdversarialDelete/*syncmap.Map                        198ns ± 5%     264ns ± 2%   +33.17%  (p\u003d0.029 n\u003d4+4)\nAdversarialDelete/*syncmap.Map-48                     291ns ± 9%     173ns ± 8%   -40.50%  (p\u003d0.029 n\u003d4+4)\n\nname                                               old alloc/op   new alloc/op   delta\nLoadMostlyHits/*syncmap_test.DeepCopyMap              7.00B ± 0%     7.00B ± 0%      ~     (all equal)\nLoadMostlyHits/*syncmap_test.DeepCopyMap-48           7.00B ± 0%     7.00B ± 0%      ~     (all equal)\nLoadMostlyHits/*syncmap_test.RWMutexMap               7.00B ± 0%     7.00B ± 0%      ~     (all equal)\nLoadMostlyHits/*syncmap_test.RWMutexMap-48            7.00B ± 0%     7.00B ± 0%      ~     (all equal)\nLoadMostlyHits/*syncmap.Map                           7.00B ± 0%     7.00B ± 0%      ~     (all equal)\nLoadMostlyHits/*syncmap.Map-48                        7.00B ± 0%     7.00B ± 0%      ~     (all equal)\nLoadMostlyMisses/*syncmap_test.DeepCopyMap            7.00B ± 0%     7.00B ± 0%      ~     (all equal)\nLoadMostlyMisses/*syncmap_test.DeepCopyMap-48         7.00B ± 0%     7.00B ± 0%      ~     (all equal)\nLoadMostlyMisses/*syncmap_test.RWMutexMap             7.00B ± 0%     7.00B ± 0%      ~     (all equal)\nLoadMostlyMisses/*syncmap_test.RWMutexMap-48          7.00B ± 0%     7.00B ± 0%      ~     (all equal)\nLoadMostlyMisses/*syncmap.Map                         7.00B ± 0%     7.00B ± 0%      ~     (all equal)\nLoadMostlyMisses/*syncmap.Map-48                      7.00B ± 0%     7.00B ± 0%      ~     (all equal)\nLoadOrStoreBalanced/*syncmap_test.RWMutexMap          95.0B ± 0%     95.0B ± 0%      ~     (all equal)\nLoadOrStoreBalanced/*syncmap_test.RWMutexMap-48       95.0B ± 0%     95.0B ± 0%      ~     (all equal)\nLoadOrStoreBalanced/*syncmap.Map                      95.0B ± 0%     88.0B ± 0%    -7.37%  (p\u003d0.029 n\u003d4+4)\nLoadOrStoreBalanced/*syncmap.Map-48                   95.0B ± 0%     88.0B ± 0%    -7.37%  (p\u003d0.029 n\u003d4+4)\nLoadOrStoreUnique/*syncmap_test.RWMutexMap             175B ± 0%      175B ± 0%      ~     (all equal)\nLoadOrStoreUnique/*syncmap_test.RWMutexMap-48          175B ± 0%      175B ± 0%      ~     (all equal)\nLoadOrStoreUnique/*syncmap.Map                         175B ± 0%      161B ± 0%    -8.00%  (p\u003d0.029 n\u003d4+4)\nLoadOrStoreUnique/*syncmap.Map-48                      175B ± 0%      161B ± 0%    -8.00%  (p\u003d0.029 n\u003d4+4)\nLoadOrStoreCollision/*syncmap_test.DeepCopyMap        0.00B          0.00B           ~     (all equal)\nLoadOrStoreCollision/*syncmap_test.DeepCopyMap-48     0.00B          0.00B           ~     (all equal)\nLoadOrStoreCollision/*syncmap_test.RWMutexMap         0.00B          0.00B           ~     (all equal)\nLoadOrStoreCollision/*syncmap_test.RWMutexMap-48      0.00B          0.00B           ~     (all equal)\nLoadOrStoreCollision/*syncmap.Map                     0.00B          0.00B           ~     (all equal)\nLoadOrStoreCollision/*syncmap.Map-48                  0.00B          0.00B           ~     (all equal)\nRange/*syncmap_test.DeepCopyMap                       0.00B          0.00B           ~     (all equal)\nRange/*syncmap_test.DeepCopyMap-48                    0.00B          0.00B           ~     (all equal)\nRange/*syncmap_test.RWMutexMap                        0.00B          0.00B           ~     (all equal)\nRange/*syncmap_test.RWMutexMap-48                     0.00B          0.00B           ~     (all equal)\nRange/*syncmap.Map                                    0.00B          0.00B           ~     (all equal)\nRange/*syncmap.Map-48                                 0.00B          0.00B           ~     (all equal)\nAdversarialAlloc/*syncmap_test.DeepCopyMap            74.0B ± 0%     74.0B ± 0%      ~     (all equal)\nAdversarialAlloc/*syncmap_test.DeepCopyMap-48        3.15kB ± 0%    3.15kB ± 0%      ~     (p\u003d1.000 n\u003d4+4)\nAdversarialAlloc/*syncmap_test.RWMutexMap             8.00B ± 0%     8.00B ± 0%      ~     (all equal)\nAdversarialAlloc/*syncmap_test.RWMutexMap-48          8.00B ± 0%     8.00B ± 0%      ~     (all equal)\nAdversarialAlloc/*syncmap.Map                         74.0B ± 0%     55.0B ± 0%   -25.68%  (p\u003d0.029 n\u003d4+4)\nAdversarialAlloc/*syncmap.Map-48                      8.00B ± 0%    56.25B ± 1%  +603.12%  (p\u003d0.029 n\u003d4+4)\nAdversarialDelete/*syncmap_test.DeepCopyMap            155B ± 0%      155B ± 0%      ~     (all equal)\nAdversarialDelete/*syncmap_test.DeepCopyMap-48         156B ± 0%      156B ± 0%      ~     (p\u003d1.000 n\u003d4+4)\nAdversarialDelete/*syncmap_test.RWMutexMap            8.00B ± 0%     8.00B ± 0%      ~     (all equal)\nAdversarialDelete/*syncmap_test.RWMutexMap-48         8.00B ± 0%     8.00B ± 0%      ~     (all equal)\nAdversarialDelete/*syncmap.Map                        81.0B ± 0%     65.0B ± 0%   -19.75%  (p\u003d0.029 n\u003d4+4)\nAdversarialDelete/*syncmap.Map-48                     23.0B ± 9%     15.2B ± 5%   -33.70%  (p\u003d0.029 n\u003d4+4)\n\nname                                               old allocs/op  new allocs/op  delta\nLoadMostlyHits/*syncmap_test.DeepCopyMap               0.00           0.00           ~     (all equal)\nLoadMostlyHits/*syncmap_test.DeepCopyMap-48            0.00           0.00           ~     (all equal)\nLoadMostlyHits/*syncmap_test.RWMutexMap                0.00           0.00           ~     (all equal)\nLoadMostlyHits/*syncmap_test.RWMutexMap-48             0.00           0.00           ~     (all equal)\nLoadMostlyHits/*syncmap.Map                            0.00           0.00           ~     (all equal)\nLoadMostlyHits/*syncmap.Map-48                         0.00           0.00           ~     (all equal)\nLoadMostlyMisses/*syncmap_test.DeepCopyMap             0.00           0.00           ~     (all equal)\nLoadMostlyMisses/*syncmap_test.DeepCopyMap-48          0.00           0.00           ~     (all equal)\nLoadMostlyMisses/*syncmap_test.RWMutexMap              0.00           0.00           ~     (all equal)\nLoadMostlyMisses/*syncmap_test.RWMutexMap-48           0.00           0.00           ~     (all equal)\nLoadMostlyMisses/*syncmap.Map                          0.00           0.00           ~     (all equal)\nLoadMostlyMisses/*syncmap.Map-48                       0.00           0.00           ~     (all equal)\nLoadOrStoreBalanced/*syncmap_test.RWMutexMap           2.00 ± 0%      2.00 ± 0%      ~     (all equal)\nLoadOrStoreBalanced/*syncmap_test.RWMutexMap-48        2.00 ± 0%      2.00 ± 0%      ~     (all equal)\nLoadOrStoreBalanced/*syncmap.Map                       2.00 ± 0%      3.00 ± 0%   +50.00%  (p\u003d0.029 n\u003d4+4)\nLoadOrStoreBalanced/*syncmap.Map-48                    2.00 ± 0%      3.00 ± 0%   +50.00%  (p\u003d0.029 n\u003d4+4)\nLoadOrStoreUnique/*syncmap_test.RWMutexMap             2.00 ± 0%      2.00 ± 0%      ~     (all equal)\nLoadOrStoreUnique/*syncmap_test.RWMutexMap-48          2.00 ± 0%      2.00 ± 0%      ~     (all equal)\nLoadOrStoreUnique/*syncmap.Map                         2.00 ± 0%      4.00 ± 0%  +100.00%  (p\u003d0.029 n\u003d4+4)\nLoadOrStoreUnique/*syncmap.Map-48                      2.00 ± 0%      4.00 ± 0%  +100.00%  (p\u003d0.029 n\u003d4+4)\nLoadOrStoreCollision/*syncmap_test.DeepCopyMap         0.00           0.00           ~     (all equal)\nLoadOrStoreCollision/*syncmap_test.DeepCopyMap-48      0.00           0.00           ~     (all equal)\nLoadOrStoreCollision/*syncmap_test.RWMutexMap          0.00           0.00           ~     (all equal)\nLoadOrStoreCollision/*syncmap_test.RWMutexMap-48       0.00           0.00           ~     (all equal)\nLoadOrStoreCollision/*syncmap.Map                      0.00           0.00           ~     (all equal)\nLoadOrStoreCollision/*syncmap.Map-48                   0.00           0.00           ~     (all equal)\nRange/*syncmap_test.DeepCopyMap                        0.00           0.00           ~     (all equal)\nRange/*syncmap_test.DeepCopyMap-48                     0.00           0.00           ~     (all equal)\nRange/*syncmap_test.RWMutexMap                         0.00           0.00           ~     (all equal)\nRange/*syncmap_test.RWMutexMap-48                      0.00           0.00           ~     (all equal)\nRange/*syncmap.Map                                     0.00           0.00           ~     (all equal)\nRange/*syncmap.Map-48                                  0.00           0.00           ~     (all equal)\nAdversarialAlloc/*syncmap_test.DeepCopyMap             1.00 ± 0%      1.00 ± 0%      ~     (all equal)\nAdversarialAlloc/*syncmap_test.DeepCopyMap-48          1.00 ± 0%      1.00 ± 0%      ~     (all equal)\nAdversarialAlloc/*syncmap_test.RWMutexMap              1.00 ± 0%      1.00 ± 0%      ~     (all equal)\nAdversarialAlloc/*syncmap_test.RWMutexMap-48           1.00 ± 0%      1.00 ± 0%      ~     (all equal)\nAdversarialAlloc/*syncmap.Map                          1.00 ± 0%      1.00 ± 0%      ~     (all equal)\nAdversarialAlloc/*syncmap.Map-48                       1.00 ± 0%      1.00 ± 0%      ~     (all equal)\nAdversarialDelete/*syncmap_test.DeepCopyMap            1.00 ± 0%      1.00 ± 0%      ~     (all equal)\nAdversarialDelete/*syncmap_test.DeepCopyMap-48         1.00 ± 0%      1.00 ± 0%      ~     (all equal)\nAdversarialDelete/*syncmap_test.RWMutexMap             1.00 ± 0%      1.00 ± 0%      ~     (all equal)\nAdversarialDelete/*syncmap_test.RWMutexMap-48          1.00 ± 0%      1.00 ± 0%      ~     (all equal)\nAdversarialDelete/*syncmap.Map                         1.00 ± 0%      1.00 ± 0%      ~     (all equal)\nAdversarialDelete/*syncmap.Map-48                      1.00 ± 0%      1.00 ± 0%      ~     (all equal)\n\nChange-Id: I93c9458505d84238cc8e9016a7dfd285868af236\nReviewed-on: https://go-review.googlesource.com/37342\nReviewed-by: Russ Cox \u003crsc@golang.org\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "1efbcb20d88ea0c61666a2afeb8aeb8b8bfa4932",
      "old_mode": 33188,
      "old_path": "syncmap/map.go",
      "new_id": "80e15847ef49bbbae65031db80ce062f32bfd86c",
      "new_mode": 33188,
      "new_path": "syncmap/map.go"
    }
  ]
}
