1
0
mirror of https://github.com/golang/go synced 2024-11-05 22:46:12 -07:00

net/netip: reduce allocations in Addr.String for v4-in-v6 addresses

ip.Unmap will always return an Addr with ip.z == z4 in case of an
v4-in-v6 address. Thus, Addr.string4 can be called directly without the
additional indirection.

name                      old time/op    new time/op    delta
IPString/v6_v4-4             108ns ± 3%      74ns ± 4%  -31.23%  (p=0.000 n=9+10)
IPStringExpanded/v6_v4-4    89.6ns ± 6%    77.2ns ± 3%  -13.91%  (p=0.000 n=10+10)
AddrPortString/v6_v4-4       253ns ± 8%     197ns ± 3%  -22.13%  (p=0.000 n=10+10)

name                      old alloc/op   new alloc/op   delta
IPString/v6_v4-4             40.0B ± 0%     24.0B ± 0%  -40.00%  (p=0.000 n=10+10)
IPStringExpanded/v6_v4-4     48.0B ± 0%     48.0B ± 0%     ~     (all equal)
AddrPortString/v6_v4-4       77.0B ± 0%     61.0B ± 0%  -20.78%  (p=0.000 n=10+10)

name                      old allocs/op  new allocs/op  delta
IPString/v6_v4-4              2.00 ± 0%      1.00 ± 0%  -50.00%  (p=0.000 n=10+10)
IPStringExpanded/v6_v4-4      1.00 ± 0%      1.00 ± 0%     ~     (all equal)
AddrPortString/v6_v4-4        4.00 ± 0%      3.00 ± 0%  -25.00%  (p=0.000 n=10+10)

Change-Id: Id4affaf7a493aa11579c48721294f2e5889a8bef
Reviewed-on: https://go-review.googlesource.com/c/go/+/403914
Run-TryBot: Tobias Klauser <tobias.klauser@gmail.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
Reviewed-by: Damien Neil <dneil@google.com>
Auto-Submit: Tobias Klauser <tobias.klauser@gmail.com>
This commit is contained in:
Tobias Klauser 2022-05-04 21:45:02 +02:00 committed by Gopher Robot
parent 83ee6c1d16
commit f2cd6d60ae
2 changed files with 27 additions and 3 deletions

View File

@ -768,11 +768,10 @@ func (ip Addr) String() string {
return ip.string4() return ip.string4()
default: default:
if ip.Is4In6() { if ip.Is4In6() {
// TODO(bradfitz): this could alloc less.
if z := ip.Zone(); z != "" { if z := ip.Zone(); z != "" {
return "::ffff:" + ip.Unmap().String() + "%" + z return "::ffff:" + ip.Unmap().string4() + "%" + z
} else { } else {
return "::ffff:" + ip.Unmap().String() return "::ffff:" + ip.Unmap().string4()
} }
} }
return ip.string6() return ip.string6()

View File

@ -1894,6 +1894,31 @@ func TestNoAllocs(t *testing.T) {
test("IPPRefix.Masked", func() { sinkPrefix = MustParsePrefix("1.2.3.4/16").Masked() }) test("IPPRefix.Masked", func() { sinkPrefix = MustParsePrefix("1.2.3.4/16").Masked() })
} }
func TestAddrStringAllocs(t *testing.T) {
tests := []struct {
name string
ip Addr
wantAllocs int
}{
{"zero", Addr{}, 0},
{"ipv4", MustParseAddr("192.168.1.1"), 1},
{"ipv6", MustParseAddr("2001:db8::1"), 1},
{"ipv6+zone", MustParseAddr("2001:db8::1%eth0"), 1},
{"ipv4-in-ipv6", MustParseAddr("::ffff:192.168.1.1"), 1},
{"ipv4-in-ipv6+zone", MustParseAddr("::ffff:192.168.1.1%eth0"), 1},
}
for _, tc := range tests {
t.Run(tc.name, func(t *testing.T) {
allocs := int(testing.AllocsPerRun(1000, func() {
sinkString = tc.ip.String()
}))
if allocs != tc.wantAllocs {
t.Errorf("allocs=%d, want %d", allocs, tc.wantAllocs)
}
})
}
}
func TestPrefixString(t *testing.T) { func TestPrefixString(t *testing.T) {
tests := []struct { tests := []struct {
ipp Prefix ipp Prefix