aboutsummaryrefslogtreecommitdiff
path: root/src/syscall
diff options
context:
space:
mode:
authorJosh Bleecher Snyder <josharian@gmail.com>2021-02-11 19:34:22 -0800
committerDamien Neil <dneil@google.com>2021-08-16 23:57:02 +0000
commit9c5eb16f6cba2b3d75f440dfec157183cc6d0f35 (patch)
tree9de133a63e114dc01f4bd6b0be4a100f9b7770a6 /src/syscall
parentd9349175ad13ab228d3224c4bff8e3e1b2936b42 (diff)
downloadgo-9c5eb16f6cba2b3d75f440dfec157183cc6d0f35.tar.gz
go-9c5eb16f6cba2b3d75f440dfec157183cc6d0f35.zip
net: reduce allocation size in ReadFromUDP
Switch to concrete types. Bring your own object to fill in. Allocate just enough for the IP byte slice. The allocation is now just 4 bytes for IPv4, which puts it in the tiny allocator, which is much faster. name old time/op new time/op delta WriteToReadFromUDP-8 13.7µs ± 1% 13.4µs ± 2% -2.49% (p=0.000 n=10+10) name old alloc/op new alloc/op delta WriteToReadFromUDP-8 32.0B ± 0% 4.0B ± 0% -87.50% (p=0.000 n=10+10) name old allocs/op new allocs/op delta WriteToReadFromUDP-8 1.00 ± 0% 1.00 ± 0% ~ (all equal) Windows is temporarily stubbed out. Updates #43451 Change-Id: Ief506f891b401d28715d22dce6ebda037941924e Reviewed-on: https://go-review.googlesource.com/c/go/+/331490 Trust: Josh Bleecher Snyder <josharian@gmail.com> Trust: Damien Neil <dneil@google.com> Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com> Run-TryBot: Damien Neil <dneil@google.com> Reviewed-by: Damien Neil <dneil@google.com>
Diffstat (limited to 'src/syscall')
-rw-r--r--src/syscall/net_js.go8
-rw-r--r--src/syscall/syscall_unix.go27
2 files changed, 35 insertions, 0 deletions
diff --git a/src/syscall/net_js.go b/src/syscall/net_js.go
index 17799148bd..2998c2159c 100644
--- a/src/syscall/net_js.go
+++ b/src/syscall/net_js.go
@@ -92,6 +92,14 @@ func Recvfrom(fd int, p []byte, flags int) (n int, from Sockaddr, err error) {
return 0, nil, ENOSYS
}
+func RecvfromInet4(fd int, p []byte, flags int, from *SockaddrInet4) (n int, err error) {
+ return 0, ENOSYS
+}
+
+func RecvfromInet6(fd int, p []byte, flags int, from *SockaddrInet6) (n int, err error) {
+ return 0, ENOSYS
+}
+
func Sendto(fd int, p []byte, flags int, to Sockaddr) error {
return ENOSYS
}
diff --git a/src/syscall/syscall_unix.go b/src/syscall/syscall_unix.go
index 60aeae14de..101e39c7d0 100644
--- a/src/syscall/syscall_unix.go
+++ b/src/syscall/syscall_unix.go
@@ -292,6 +292,33 @@ func Recvfrom(fd int, p []byte, flags int) (n int, from Sockaddr, err error) {
return
}
+func RecvfromInet4(fd int, p []byte, flags int, from *SockaddrInet4) (n int, err error) {
+ var rsa RawSockaddrAny
+ var socklen _Socklen = SizeofSockaddrAny
+ if n, err = recvfrom(fd, p, flags, &rsa, &socklen); err != nil {
+ return
+ }
+ pp := (*RawSockaddrInet4)(unsafe.Pointer(&rsa))
+ port := (*[2]byte)(unsafe.Pointer(&pp.Port))
+ from.Port = int(port[0])<<8 + int(port[1])
+ from.Addr = pp.Addr
+ return
+}
+
+func RecvfromInet6(fd int, p []byte, flags int, from *SockaddrInet6) (n int, err error) {
+ var rsa RawSockaddrAny
+ var socklen _Socklen = SizeofSockaddrAny
+ if n, err = recvfrom(fd, p, flags, &rsa, &socklen); err != nil {
+ return
+ }
+ pp := (*RawSockaddrInet6)(unsafe.Pointer(&rsa))
+ port := (*[2]byte)(unsafe.Pointer(&pp.Port))
+ from.Port = int(port[0])<<8 + int(port[1])
+ from.ZoneId = pp.Scope_id
+ from.Addr = pp.Addr
+ return
+}
+
func SendtoInet4(fd int, p []byte, flags int, to SockaddrInet4) (err error) {
ptr, n, err := to.sockaddr()
if err != nil {