1. 17 Feb, 2015 9 commits
  2. 14 Feb, 2015 1 commit
  3. 13 Feb, 2015 29 commits
  4. 12 Feb, 2015 1 commit
    • 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: default avatarRuss Cox <rsc@golang.org>
      Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
      77a21139