)]}'
{
  "commit": "9d98477ca922253e1db5ec213a188927385d25db",
  "tree": "6ae1d910793ae070fcd47fe48e1b0978a67b7311",
  "parents": [
    "7f86060aae572ca1aab356712d3d3a433e13565a"
  ],
  "author": {
    "name": "Tony Liao",
    "email": "tonyliaoss@google.com",
    "time": "Tue Aug 25 07:03:34 2026 -0700"
  },
  "committer": {
    "name": "Copybara-Service",
    "email": "copybara-worker@google.com",
    "time": "Tue Aug 25 07:09:41 2026 -0700"
  },
  "message": "Optimize pure Python parse path for custom JSON enum names.\n\nThis implementation is similar to our Java idea in cl/949670944,\nbasically the idea is that we will have a local map (dictionary) that\nwill be populated the very first time we try to parse into an enum\nfield. The lifetime of this dictionary will be tied to the Parser\ninstance, similar to the Java implementation.\n\nBENCHMARKS (baseline stats are recorded at cl/952170250):\n\nPython:\n```\n[BENCHMARK] ParseJsonDefault:                med 10.06 us/op | p99 11.22 us/op | mean 10.10 ± 0.20 us/op\n[BENCHMARK] ParseJsonCustom:                 med 20.33 us/op | p99 22.23 us/op | mean 20.40 ± 0.34 us/op\n[BENCHMARK] ParseJsonUnknownIgnored:         med 24.21 us/op | p99 26.25 us/op | mean 24.31 ± 0.44 us/op\n[BENCHMARK] ParseRepeatedJsonDefault:        med 1.94 us/item | p99 2.05 us/item | mean 1.95 ± 0.03 us/item\n[BENCHMARK] ParseRepeatedJsonCustom:         med 2.26 us/item | p99 2.45 us/item | mean 2.27 ± 0.03 us/item\n[BENCHMARK] ParseRepeatedJsonUnknownIgnored: med 5.31 us/item | p99 5.52 us/item | mean 5.32 ± 0.05 us/item\n```\n\nCpp:\n```\n[BENCHMARK] ParseJsonDefault:                med 8.66 us/op | p99 9.21 us/op | mean 8.70 ± 0.13 us/op\n[BENCHMARK] ParseJsonCustom:                 med 26.33 us/op | p99 29.71 us/op | mean 26.44 ± 0.69 us/op\n[BENCHMARK] ParseJsonUnknownIgnored:         med 28.46 us/op | p99 31.80 us/op | mean 28.59 ± 0.67 us/op\n[BENCHMARK] ParseRepeatedJsonDefault:        med 1.72 us/item | p99 2.19 us/item | mean 1.74 ± 0.06 us/item\n[BENCHMARK] ParseRepeatedJsonCustom:         med 2.12 us/item | p99 2.38 us/item | mean 2.13 ± 0.04 us/item\n[BENCHMARK] ParseRepeatedJsonUnknownIgnored: med 4.61 us/item | p99 4.92 us/item | mean 4.62 ± 0.07 us/item\n```\n\nUPB:\n```\n[BENCHMARK] ParseJsonDefault:                med 11.22 us/op | p99 12.29 us/op | mean 11.27 ± 0.21 us/op\n[BENCHMARK] ParseJsonCustom:                 med 37.54 us/op | p99 39.25 us/op | mean 37.65 ± 0.46 us/op\n[BENCHMARK] ParseJsonUnknownIgnored:         med 41.18 us/op | p99 48.45 us/op | mean 41.30 ± 0.89 us/op\n[BENCHMARK] ParseRepeatedJsonDefault:        med 2.10 us/item | p99 2.19 us/item | mean 2.10 ± 0.02 us/item\n[BENCHMARK] ParseRepeatedJsonCustom:         med 2.58 us/item | p99 2.73 us/item | mean 2.59 ± 0.03 us/item\n[BENCHMARK] ParseRepeatedJsonUnknownIgnored: med 5.70 us/item | p99 5.90 us/item | mean 5.71 ± 0.04 us/item\n```\n\nSeeing these benchmarks, we can see a very noticeable improvement in\n`ParseRepeatedJsonCustom` and `ParseRepeatedJsonUnknownIgnored` cases --\nwhich correspond to the pathological cases that we are worried about.\nSingular fields are taking longer to parse in our microbenchmark because\nthe cache that we\u0027ve added is tied to each Parser instance and must be\nre-instantiated across every `Parse` call.\n\nPiperOrigin-RevId: 970528683\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "f50ca38f00e785fc75d7f8570706f034395560ad",
      "old_mode": 33188,
      "old_path": "python/google/protobuf/internal/json_format_test.py",
      "new_id": "98273c1a962733f963d08eb141fa799bbb36ef2c",
      "new_mode": 33188,
      "new_path": "python/google/protobuf/internal/json_format_test.py"
    },
    {
      "type": "modify",
      "old_id": "b85be581618c0ddf41aa47c72e231bcdf2d6dab4",
      "old_mode": 33188,
      "old_path": "python/google/protobuf/json_format.py",
      "new_id": "90a0b3e7b50231d37467a1b123ddb3715e1543f8",
      "new_mode": 33188,
      "new_path": "python/google/protobuf/json_format.py"
    }
  ]
}
