• Josh Bleecher Snyder's avatar
    cmd/compile: make typenamesym do less work · 91433eb5
    Josh Bleecher Snyder authored
    typenamesym is called from three places:
    typename, ngotype, and Type.Symbol.
    Only in typename do we actually need a Node.
    ngotype and Type.Symbol require only a Sym.
    And writing the newly created Node to
    Sym.Def is unsafe in a concurrent backend.
    Rather than use a mutex protect to Sym.Def,
    make typenamesym not touch Sym.Def.
    
    The assignment to Sym.Def was serving a second purpose,
    namely to prevent duplicate entries on signatlist.
    Preserve that functionality by switching signatlist to a map.
    This in turn requires that we sort signatlist
    when exporting it, to preserve reproducibility.
    
    We'd like to use Type.cmp for sorting,
    but that causes infinite recursion at the moment;
    see #19869.
    
    For now, use Type.LongString as the sort key,
    which is a complete description of the type.
    Type.LongString is relatively expensive,
    but we calculate it only once per type,
    and signatlist is generally fairly small,
    so the performance impact is minimal.
    
    Updates #15756
    
    name       old alloc/op    new alloc/op    delta
    Template      39.4MB ± 0%     39.4MB ± 0%    ~     (p=0.222 n=5+5)
    Unicode       29.8MB ± 0%     29.8MB ± 0%    ~     (p=0.151 n=5+5)
    GoTypes        113MB ± 0%      113MB ± 0%    ~     (p=0.095 n=5+5)
    SSA           1.25GB ± 0%     1.25GB ± 0%  +0.04%  (p=0.008 n=5+5)
    Flate         25.3MB ± 0%     25.4MB ± 0%    ~     (p=0.056 n=5+5)
    GoParser      31.8MB ± 0%     31.8MB ± 0%    ~     (p=0.310 n=5+5)
    Reflect       78.3MB ± 0%     78.3MB ± 0%    ~     (p=0.690 n=5+5)
    Tar           26.7MB ± 0%     26.7MB ± 0%    ~     (p=0.548 n=5+5)
    XML           42.2MB ± 0%     42.2MB ± 0%    ~     (p=0.222 n=5+5)
    
    name       old allocs/op   new allocs/op   delta
    Template        387k ± 0%       388k ± 0%    ~     (p=0.056 n=5+5)
    Unicode         320k ± 0%       321k ± 0%  +0.32%  (p=0.032 n=5+5)
    GoTypes        1.14M ± 0%      1.15M ± 0%    ~     (p=0.095 n=5+5)
    SSA            9.70M ± 0%      9.72M ± 0%  +0.18%  (p=0.008 n=5+5)
    Flate           234k ± 0%       235k ± 0%  +0.60%  (p=0.008 n=5+5)
    GoParser        317k ± 0%       317k ± 0%    ~     (p=1.000 n=5+5)
    Reflect         982k ± 0%       983k ± 0%    ~     (p=0.841 n=5+5)
    Tar             252k ± 1%       252k ± 0%    ~     (p=0.310 n=5+5)
    XML             393k ± 0%       392k ± 0%    ~     (p=0.548 n=5+5)
    
    Change-Id: I53a3b95d19cf1a7b7511a94fba896706addf84fb
    Reviewed-on: https://go-review.googlesource.com/39710
    Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    Reviewed-by: default avatarMatthew Dempsky <mdempsky@google.com>
    91433eb5
reflect.go 45.5 KB