• Josh Bleecher Snyder's avatar
    cmd/gc: evaluate concrete == interface without allocating · 77a21139
    Josh Bleecher Snyder authored
    Consider an interface value i of type I and concrete value c of type C.
    
    Prior to this CL, i==c was evaluated as
    	I(c) == i
    
    Evaluating I(c) can allocate.
    
    This CL changes the evaluation of i==c to
    	x, ok := i.(C); ok && x == c
    
    The new generated code is shorter and does not allocate directly.
    
    If C is small, as it is in every instance in the stdlib,
    the new code also uses less stack space
    and makes one runtime call instead of two.
    
    If C is very large, the original implementation is used.
    The cutoff for "very large" is 1<<16,
    following the stack vs heap cutoff used elsewhere.
    
    This kind of comparison occurs in 38 places in the stdlib,
    mostly in the net and os packages.
    
    benchmark                     old ns/op     new ns/op     delta
    BenchmarkEqEfaceConcrete      29.5          7.92          -73.15%
    BenchmarkEqIfaceConcrete      32.1          7.90          -75.39%
    BenchmarkNeEfaceConcrete      29.9          7.90          -73.58%
    BenchmarkNeIfaceConcrete      35.9          7.90          -77.99%
    
    Fixes #9370.
    
    Change-Id: I7c4555950bcd6406ee5c613be1f2128da2c9a2b7
    Reviewed-on: https://go-review.googlesource.com/2096Reviewed-by: 's avatarRuss Cox <rsc@golang.org>
    Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
    77a21139
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...
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/syscall Loading commit data...
io Loading commit data...
lib9 Loading commit data...
libbio Loading commit data...
liblink 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...
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...
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...
clean.bash Loading commit data...
clean.bat Loading commit data...
clean.rc Loading commit data...
make.bash Loading commit data...
make.bat Loading commit data...
make.rc 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...