• Josh Bleecher Snyder's avatar
    runtime: optimize storing new keys in mapassign_fastNN · 25bbb695
    Josh Bleecher Snyder authored
    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: 's avatarAustin Clements <austin@google.com>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    25bbb695
Name
Last commit
Last update
..
archive Loading commit data...
bufio Loading commit data...
builtin Loading commit data...
bytes Loading commit data...
cmd Loading commit data...
compress Loading commit data...
container Loading commit data...
context Loading commit data...
crypto Loading commit data...
database/sql Loading commit data...
debug Loading commit data...
encoding Loading commit data...
errors Loading commit data...
expvar Loading commit data...
flag Loading commit data...
fmt Loading commit data...
go Loading commit data...
hash Loading commit data...
html Loading commit data...
image Loading commit data...
index/suffixarray Loading commit data...
internal Loading commit data...
io Loading commit data...
log Loading commit data...
math Loading commit data...
mime Loading commit data...
net Loading commit data...
os Loading commit data...
path Loading commit data...
plugin Loading commit data...
reflect Loading commit data...
regexp Loading commit data...
runtime Loading commit data...
sort Loading commit data...
strconv Loading commit data...
strings Loading commit data...
sync Loading commit data...
syscall Loading commit data...
testing Loading commit data...
text Loading commit data...
time Loading commit data...
unicode Loading commit data...
unsafe Loading commit data...
vendor/golang_org/x Loading commit data...
Make.dist Loading commit data...
all.bash Loading commit data...
all.bat Loading commit data...
all.rc Loading commit data...
androidtest.bash Loading commit data...
bootstrap.bash Loading commit data...
buildall.bash Loading commit data...
clean.bash Loading commit data...
clean.bat Loading commit data...
clean.rc Loading commit data...
cmp.bash Loading commit data...
iostest.bash Loading commit data...
make.bash Loading commit data...
make.bat Loading commit data...
make.rc Loading commit data...
naclmake.bash Loading commit data...
nacltest.bash Loading commit data...
race.bash Loading commit data...
race.bat Loading commit data...
run.bash Loading commit data...
run.bat Loading commit data...
run.rc Loading commit data...