commit | 82760ceffaa2541f404cd14beb6cb35bf0d38c3c | [log] [tgz] |
---|---|---|
author | Joe Tsai <joetsai@digital-static.net> | Thu Jun 20 03:09:57 2019 -0700 |
committer | Joe Tsai <joetsai@digital-static.net> | Wed Jul 10 19:44:24 2019 +0000 |
tree | 7b1df2cbebde6e5f381ee039f655d73befe79701 | |
parent | 36dc22ddb8a46ab2f11cba079cc1192a5d4660a3 [diff] |
internal/impl: add MessageState to every generated message We define MessageState, which is essentially an atomically set *MessageInfo. By nesting this as the first field in every generated message, we can implement the reflective methods on a *MessageState when obtained by unsafe casting a concrete message pointer as a *MessageState. The MessageInfo held by MessageState provides additional Go type information to interpret the memory that comes after the contents of the MessageState. Since we are nesting a MessageState in every message, the memory use of every message instance grows by 8B. On average, the body of ProtoReflect grows from 133B to 202B (+50%). However, this is offset by XXX_Methods, which is 108B and will be removed in a future CL. Taking into account the eventual removal of XXX_Methods, this is a net reduction of 25%. name old time/op new time/op delta Name/Value-4 70.3ns ± 2% 17.5ns ± 6% -75.08% (p=0.000 n=10+10) Name/Nil-4 70.6ns ± 3% 33.4ns ± 2% -52.66% (p=0.000 n=10+10) name old alloc/op new alloc/op delta Name/Value-4 16.0B ± 0% 0.0B -100.00% (p=0.000 n=10+10) Name/Nil-4 16.0B ± 0% 0.0B -100.00% (p=0.000 n=10+10) name old allocs/op new allocs/op delta Name/Value-4 1.00 ± 0% 0.00 -100.00% (p=0.000 n=10+10) Name/Nil-4 1.00 ± 0% 0.00 -100.00% (p=0.000 n=10+10) Change-Id: I92bd58dc681c57c92612fd5ba7fc066aea34e95a Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/185460 Reviewed-by: Damien Neil <dneil@google.com>
WARNING: This repository is in active development. There are no guarantees about API stability. Breaking changes will occur until a stable release is made and announced.
This repository is for the development of the next major Go implementation of protocol buffers. This library makes breaking API changes relative to the existing Go protobuf library. Of particular note, this API aims to make protobuf reflection a first-class feature of the API and implements the protobuf ecosystem in terms of reflection.
List of relevant design documents:
We appreciate community contributions. See CONTRIBUTING.md.
Issues regarding the new API can be filed at github.com/golang/protobuf. Please use a APIv2:
prefix in the title to make it clear that the issue is regarding the new API work.