25bbb695c8
Prior to this change, we use typedmemmove to write the key value to its new location in mapassign_fast32 and mapassign_fast64. (The use of typedmemmove was a last-minute fix in the 1.9 cycle; see #21297 and CL 53414.) This is significantly less inefficient than direct assignment or calling writebarrierptr directly. Fortunately, there aren't many cases to consider. On systems with 32 bit pointers: * A 32 bit AMEM value either is a single pointer or has no pointers. * A 64 bit AMEM value may contain a pointer at the beginning, a pointer at 32 bits, or two pointers. On systems with 64 bit pointers: * A 32 bit AMEM value contains no pointers. * A 64 bit AMEM value either is a single pointer or has no pointers. All combinations except the 32 bit pointers / 64 bit AMEM value are cheap and easy to handle, and the problematic case is likely rare. The most popular map keys appear to be ints and pointers. So we handle them exhaustively. The sys.PtrSize checks are constant branches and are eliminated by the compiler. An alternative fix would be to return a pointer to the key, and have the calling code do the assignment, at which point the compiler would have full type information. Initial tests suggest that the performance difference between these strategies is negligible, and this fix is considerably simpler, and has much less impact on binary size. Fixes #21321 Change-Id: Ib03200e89e2324dd3c76d041131447df66f22bfe Reviewed-on: https://go-review.googlesource.com/59110 Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com> Reviewed-by: Austin Clements <austin@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> |
||
---|---|---|
.github | ||
api | ||
doc | ||
lib/time | ||
misc | ||
src | ||
test | ||
.gitattributes | ||
.gitignore | ||
AUTHORS | ||
CONTRIBUTING.md | ||
CONTRIBUTORS | ||
favicon.ico | ||
LICENSE | ||
PATENTS | ||
README.md | ||
robots.txt |
The Go Programming Language
Go is an open source programming language that makes it easy to build simple, reliable, and efficient software.
Gopher image by Renee French, licensed under Creative Commons 3.0 Attributions license.
Our canonical Git repository is located at https://go.googlesource.com/go. There is a mirror of the repository at https://github.com/golang/go.
Unless otherwise noted, the Go source files are distributed under the BSD-style license found in the LICENSE file.
Download and Install
Binary Distributions
Official binary distributions are available at https://golang.org/dl/.
After downloading a binary release, visit https://golang.org/doc/install or load doc/install.html in your web browser for installation instructions.
Install From Source
If a binary distribution is not available for your combination of operating system and architecture, visit https://golang.org/doc/install/source or load doc/install-source.html in your web browser for source installation instructions.
Contributing
Go is the work of hundreds of contributors. We appreciate your help!
To contribute, please read the contribution guidelines: https://golang.org/doc/contribute.html
Note that the Go project does not use GitHub pull requests, and that we use the issue tracker for bug reports and proposals only. See https://golang.org/wiki/Questions for a list of places to ask questions about the Go language.