Skip to content

Commit

Permalink
non allocating AsSlice
Browse files Browse the repository at this point in the history
  • Loading branch information
mateusz834 committed Oct 11, 2022
1 parent 4274ffd commit e7619b8
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 4 deletions.
16 changes: 12 additions & 4 deletions src/net/netip/netip.go
Expand Up @@ -701,18 +701,26 @@ func (ip Addr) As4() (a4 [4]byte) {

// AsSlice returns an IPv4 or IPv6 address in its respective 4-byte or 16-byte representation.
func (ip Addr) AsSlice() []byte {
var ret []byte
if ip.z == z4 {
ret = make([]byte, 4)
} else {
ret = make([]byte, 16)
}
return ip.asSlice(ret)
}

func (ip Addr) asSlice(ret []byte) []byte {
switch ip.z {
case z0:
return nil
case z4:
var ret [4]byte
bePutUint32(ret[:], uint32(ip.addr.lo))
return ret[:]
return ret
default:
var ret [16]byte
bePutUint64(ret[:8], ip.addr.hi)
bePutUint64(ret[8:], ip.addr.lo)
return ret[:]
return ret
}
}

Expand Down
30 changes: 30 additions & 0 deletions src/net/netip/netip_test.go
Expand Up @@ -2008,6 +2008,36 @@ func TestAsSlice(t *testing.T) {
}
}

func BenchmarkAsSliceAddrv4(b *testing.B) {
addr := MustParseAddr("192.0.2.1")
for i := 0; i < b.N; i++ {
addr.AsSlice()
}
}

func BenchmarkAsSliceAddrv6(b *testing.B) {
addr := MustParseAddr("2001:db8::1")
for i := 0; i < b.N; i++ {
addr.AsSlice()
}
}

var asSliceOut []byte

func BenchmarkAsSliceAddrv4Escapes(b *testing.B) {
addr := MustParseAddr("192.0.2.1")
for i := 0; i < b.N; i++ {
asSliceOut = addr.AsSlice()
}
}

func BenchmarkAsSliceAddrv6Escapes(b *testing.B) {
addr := MustParseAddr("2001:db8::1")
for i := 0; i < b.N; i++ {
asSliceOut = addr.AsSlice()
}
}

var sink16 [16]byte

func BenchmarkAs16(b *testing.B) {
Expand Down

0 comments on commit e7619b8

Please sign in to comment.