• Austin Clements's avatar
    runtime: simplify and optimize typedslicecopy · 6a5f1e58
    Austin Clements authored
    Currently, typedslicecopy meticulously performs a typedmemmove on
    every element of the slice. This probably used to be necessary because
    we only had an individual element's type, but now we use the heap
    bitmap, so we only need to know whether the type has any pointers and
    how big it is. Hence, this CL rewrites typedslicecopy to simply
    perform one bulk barrier and one memmove.
    
    This also has a side-effect of eliminating two unnecessary write
    barriers per slice element that were coming from updates to dstp and
    srcp, which were stored in the parent stack frame. However, most of
    the win comes from eliminating the loops.
    
    name                 old time/op  new time/op  delta
    BulkWriteBarrier-12  7.83ns ±10%  7.33ns ± 6%  -6.45%  (p=0.000 n=20+20)
    
    Updates #22460.
    
    Change-Id: Id3450e9f36cc8e0892f268319b136f0d8f5464b8
    Reviewed-on: https://go-review.googlesource.com/73831
    Run-TryBot: Austin Clements <austin@google.com>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    Reviewed-by: default avatarRick Hudson <rlh@golang.org>
    6a5f1e58
mbarrier.go 14.3 KB