• 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
typecheck.c 76.3 KB