Skip to content

Commit e7619b8

Browse files
committed
non allocating AsSlice
1 parent 4274ffd commit e7619b8

File tree

2 files changed

+42
-4
lines changed

2 files changed

+42
-4
lines changed

src/net/netip/netip.go

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -701,18 +701,26 @@ func (ip Addr) As4() (a4 [4]byte) {
701701

702702
// AsSlice returns an IPv4 or IPv6 address in its respective 4-byte or 16-byte representation.
703703
func (ip Addr) AsSlice() []byte {
704+
var ret []byte
705+
if ip.z == z4 {
706+
ret = make([]byte, 4)
707+
} else {
708+
ret = make([]byte, 16)
709+
}
710+
return ip.asSlice(ret)
711+
}
712+
713+
func (ip Addr) asSlice(ret []byte) []byte {
704714
switch ip.z {
705715
case z0:
706716
return nil
707717
case z4:
708-
var ret [4]byte
709718
bePutUint32(ret[:], uint32(ip.addr.lo))
710-
return ret[:]
719+
return ret
711720
default:
712-
var ret [16]byte
713721
bePutUint64(ret[:8], ip.addr.hi)
714722
bePutUint64(ret[8:], ip.addr.lo)
715-
return ret[:]
723+
return ret
716724
}
717725
}
718726

src/net/netip/netip_test.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2008,6 +2008,36 @@ func TestAsSlice(t *testing.T) {
20082008
}
20092009
}
20102010

2011+
func BenchmarkAsSliceAddrv4(b *testing.B) {
2012+
addr := MustParseAddr("192.0.2.1")
2013+
for i := 0; i < b.N; i++ {
2014+
addr.AsSlice()
2015+
}
2016+
}
2017+
2018+
func BenchmarkAsSliceAddrv6(b *testing.B) {
2019+
addr := MustParseAddr("2001:db8::1")
2020+
for i := 0; i < b.N; i++ {
2021+
addr.AsSlice()
2022+
}
2023+
}
2024+
2025+
var asSliceOut []byte
2026+
2027+
func BenchmarkAsSliceAddrv4Escapes(b *testing.B) {
2028+
addr := MustParseAddr("192.0.2.1")
2029+
for i := 0; i < b.N; i++ {
2030+
asSliceOut = addr.AsSlice()
2031+
}
2032+
}
2033+
2034+
func BenchmarkAsSliceAddrv6Escapes(b *testing.B) {
2035+
addr := MustParseAddr("2001:db8::1")
2036+
for i := 0; i < b.N; i++ {
2037+
asSliceOut = addr.AsSlice()
2038+
}
2039+
}
2040+
20112041
var sink16 [16]byte
20122042

20132043
func BenchmarkAs16(b *testing.B) {

0 commit comments

Comments
 (0)