• 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
api Loading commit data...
doc Loading commit data...
include Loading commit data...
lib/time Loading commit data...
misc Loading commit data...
src Loading commit data...
test Loading commit data...
.gitattributes Loading commit data...
.gitignore Loading commit data...
AUTHORS Loading commit data...
CONTRIBUTING.md Loading commit data...
CONTRIBUTORS Loading commit data...
LICENSE Loading commit data...
PATENTS Loading commit data...
README.md Loading commit data...
favicon.ico Loading commit data...
robots.txt Loading commit data...