)]}'
{
  "commit": "cb9b7771abc2a63ab206dde76539f08f66ab994d",
  "tree": "1c149a6ee2503e14299f25a3e49d734a255864f7",
  "parents": [
    "4a5b3fd3082794b57dadf9f962fffa5ecad974d5"
  ],
  "author": {
    "name": "lmilewski",
    "email": "lmilewski@google.com",
    "time": "Wed Nov 16 16:53:41 2016 +0000"
  },
  "committer": {
    "name": "Lukasz Milewski",
    "email": "lmilewski@google.com",
    "time": "Wed Nov 16 09:17:24 2016 -0800"
  },
  "message": "Add a benchmark demonstrating lock contention when Marshaling/Unmarshaling maps.\n\nThis benchmark is derived from a Google service which experienced poor performance when handling protos with maps.\n\nThe current implementation of map decoding uses reflection. In particular reflect.New, reflect.NewAt, and reflect.(*Value).Addr all call reflect.(*rvalue).ptrTo.\n\nreflect.(*rvalue).ptrTo uses a cache protected by a mutex. Grabbing this lock is what causes the problem.\n\nreflect.(*rvalue).ptrTo also implements a fast path (which avoids critical sections) for certain types known to the compiler. Hopefully we can extend the compiler to generate descriptors for more types (https://golang.org/issue/17931) so that we can hit the fast path for all types needed for proto decoding.\nPiperOrigin-RevId: 139337589\n",
  "tree_diff": [
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "313e8792452f79d1f61ce38e92cbbda98ae76ef7",
      "new_mode": 33188,
      "new_path": "proto/map_test.go"
    },
    {
      "type": "modify",
      "old_id": "75d5a025993226db547ee35f957e682a4849f027",
      "old_mode": 33188,
      "old_path": "proto/proto3_proto/proto3.proto",
      "new_id": "204865571bc9286676c594de2217499f30f1b564",
      "new_mode": 33188,
      "new_path": "proto/proto3_proto/proto3.proto"
    }
  ]
}
