• Egon Elbre's avatar
    cmd/cgo: optimize cgoCheckPointer call · e85ffec7
    Egon Elbre authored
    Currently cgoCheckPointer is only used with one optional argument.
    Using a slice for the optional arguments is quite expensive, hence
    replace it with a single interface{}. This results in ~30% improvement.
    
    When checking struct fields, they quite often end up being without
    pointers. Check this before calling cgoCheckPointer, which results in
    additional ~20% improvement.
    
    Inline some p == nil checks from cgoIsGoPointer which gives
    additional ~15% improvement.
    
    All of this translates to:
    
    name                             old time/op  new time/op  delta
    CgoCall/add-int-32               46.9ns ± 1%  46.6ns ± 1%   -0.75%  (p=0.000 n=18+20)
    CgoCall/one-pointer-32            143ns ± 1%    87ns ± 1%  -38.96%  (p=0.000 n=20+20)
    CgoCall/eight-pointers-32         767ns ± 0%   327ns ± 1%  -57.30%  (p=0.000 n=18+16)
    CgoCall/eight-pointers-nil-32     110ns ± 1%    89ns ± 2%  -19.10%  (p=0.000 n=19+19)
    CgoCall/eight-pointers-array-32  5.09µs ± 1%  3.56µs ± 2%  -30.09%  (p=0.000 n=19+19)
    CgoCall/eight-pointers-slice-32  3.92µs ± 0%  2.57µs ± 2%  -34.48%  (p=0.000 n=20+20)
    
    Change-Id: I2aa9f5ae8962a9a41a7fb1db0c300893109d0d75
    Reviewed-on: https://go-review.googlesource.com/c/go/+/198081
    Run-TryBot: Ian Lance Taylor <iant@golang.org>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    Reviewed-by: default avatarIan Lance Taylor <iant@golang.org>
    e85ffec7
gcc.go 86 KB