• Daniel Martí's avatar
    reflect: make all flag.mustBe* methods inlinable · 788e038e
    Daniel Martí authored
    mustBe was barely over budget, so manually inlining the first flag.kind
    call is enough. Add a TODO to reverse that in the future, once the
    compiler gets better.
    
    mustBeExported and mustBeAssignable were over budget by a larger amount,
    so add slow path functions instead. This is the same strategy used in
    the sync package for common methods like Once.Do, for example.
    
    Lots of exported reflect.Value methods call these assert-like unexported
    methods, so avoiding the function call overhead in the common case does
    shave off a percent from most exported APIs.
    
    Finally, add the methods to TestIntendedInlining.
    
    While at it, replace a couple of uses of the 0 Kind with its descriptive
    name, Invalid.
    
    name     old time/op    new time/op    delta
    Call-8     68.0ns ± 1%    66.8ns ± 1%  -1.81%  (p=0.000 n=10+9)
    PtrTo-8    8.00ns ± 2%    7.83ns ± 0%  -2.19%  (p=0.000 n=10+9)
    
    Updates #7818.
    
    Change-Id: Ic1603b640519393f6b50dd91ec3767753eb9e761
    Reviewed-on: https://go-review.googlesource.com/c/go/+/166462
    Run-TryBot: Daniel Martí <mvdan@mvdan.cc>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
    788e038e
value.go 78.5 KB