http2: number of allocs reduced from 3852 to 31

buildRootHuffmanNode() was allocating a new node for every leaf of the huffman decoding tree.
This PR allocates an array of nodes for all the leaf nodes, and reuses them.
As buildRootHuffmanNode is only called via sync.Once, it's not significant performance wise, but still seems an unnecessary number of allocations.

benchmark           old ns/op     new ns/op     delta
BenchmarkRoot-4     162847        17911         -89.00%

benchmark           old allocs     new allocs     delta
BenchmarkRoot-4     3852           31             -99.20%

benchmark           old bytes     new bytes     delta
BenchmarkRoot-4     92112         35056         -61.94%

Change-Id: I7c1eae13fb6130090610eec1eb0347d5d1fef20c
GitHub-Last-Rev: f40a4e853001be76a8713cc6429ac203313313cb
GitHub-Pull-Request: golang/net#112
Reviewed-by: Damien Neil <>
Trust: Damien Neil <>
Trust: Alexander Rakoczy <>
Run-TryBot: Damien Neil <>
TryBot-Result: Go Bot <>
1 file changed
tree: 896eb6afaeeb20a8d9d6464ce4623bc4da8d02b9
  1. .gitattributes
  2. .gitignore
  9. bpf/
  10. codereview.cfg
  11. context/
  12. dict/
  13. dns/
  14. go.mod
  15. go.sum
  16. html/
  17. http/
  18. http2/
  19. icmp/
  20. idna/
  21. internal/
  22. ipv4/
  23. ipv6/
  24. lif/
  25. nettest/
  26. netutil/
  27. proxy/
  28. publicsuffix/
  29. route/
  30. trace/
  31. webdav/
  32. websocket/
  33. xsrftoken/

Go Networking

Go Reference

This repository holds supplementary Go networking libraries.


The easiest way to install is to run go get -u You can also manually git clone the repository to $GOPATH/src/

Report Issues / Send Patches

This repository uses Gerrit for code changes. To learn how to submit changes to this repository, see The main issue tracker for the net repository is located at Prefix your issue with “x/net:” in the subject line, so it is easy to find.