• Martin Möhrmann's avatar
    cmd/compile: optimize map-clearing range idiom · aee71dd7
    Martin Möhrmann authored
    replace map clears of the form:
    
            for k := range m {
                    delete(m, k)
            }
    
    (where m is map with key type that is reflexive for ==)
    with a new runtime function that clears the maps backing
    array with a memclr and reinitializes the hmap struct.
    
    Map key types that for example contain floats are not
    replaced by this optimization since NaN keys cannot
    be deleted from maps using delete.
    
    name                           old time/op  new time/op  delta
    GoMapClear/Reflexive/1         92.2ns ± 1%  47.1ns ± 2%  -48.89%  (p=0.000 n=9+9)
    GoMapClear/Reflexive/10         108ns ± 1%    48ns ± 2%  -55.68%  (p=0.000 n=10+10)
    GoMapClear/Reflexive/100        303ns ± 2%   110ns ± 3%  -63.56%  (p=0.000 n=10+10)
    GoMapClear/Reflexive/1000      3.58µs ± 3%  1.23µs ± 2%  -65.49%  (p=0.000 n=9+10)
    GoMapClear/Reflexive/10000     28.2µs ± 3%  10.3µs ± 2%  -63.55%  (p=0.000 n=9+10)
    GoMapClear/NonReflexive/1       121ns ± 2%   124ns ± 7%     ~     (p=0.097 n=10+10)
    GoMapClear/NonReflexive/10      137ns ± 2%   139ns ± 3%   +1.53%  (p=0.033 n=10+10)
    GoMapClear/NonReflexive/100     331ns ± 3%   334ns ± 2%     ~     (p=0.342 n=10+10)
    GoMapClear/NonReflexive/1000   3.64µs ± 3%  3.64µs ± 2%     ~     (p=0.887 n=9+10)
    GoMapClear/NonReflexive/10000  28.1µs ± 2%  28.4µs ± 3%     ~     (p=0.247 n=10+10)
    
    Fixes #20138
    
    Change-Id: I181332a8ef434a4f0d89659f492d8711db3f3213
    Reviewed-on: https://go-review.googlesource.com/110055Reviewed-by: 's avatarKeith Randall <khr@golang.org>
    aee71dd7