Skip to content

Commit b073adc

Browse files
committed
go.net/ipv4: add datagram benchmark
Current result on darwin/amd64: BenchmarkReadWriteNetUDP-2 100000 16112 ns/op 330 B/op 6 allocs/op BenchmarkReadWriteIPv4UDP-2 200000 14337 ns/op 654 B/op 14 allocs/op Update golang/go#3684 R=dave CC=golang-dev https://golang.org/cl/10125044
1 parent 2a7369b commit b073adc

File tree

1 file changed

+70
-0
lines changed

1 file changed

+70
-0
lines changed

ipv4/unicast_test.go

+70
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,76 @@ import (
1313
"testing"
1414
)
1515

16+
func benchmarkUDPListener() (net.PacketConn, net.Addr, error) {
17+
c, err := net.ListenPacket("udp4", "127.0.0.1:0")
18+
if err != nil {
19+
return nil, nil, err
20+
}
21+
dst, err := net.ResolveUDPAddr("udp4", c.LocalAddr().String())
22+
if err != nil {
23+
c.Close()
24+
return nil, nil, err
25+
}
26+
return c, dst, nil
27+
}
28+
29+
func BenchmarkReadWriteNetUDP(b *testing.B) {
30+
c, dst, err := benchmarkUDPListener()
31+
if err != nil {
32+
b.Fatalf("benchmarkUDPListener failed: %v", err)
33+
}
34+
defer c.Close()
35+
36+
wb, rb := []byte("HELLO-R-U-THERE"), make([]byte, 128)
37+
b.ResetTimer()
38+
for i := 0; i < b.N; i++ {
39+
benchmarkReadWriteNetUDP(b, c, wb, rb, dst)
40+
}
41+
}
42+
43+
func benchmarkReadWriteNetUDP(b *testing.B, c net.PacketConn, wb, rb []byte, dst net.Addr) {
44+
if _, err := c.WriteTo(wb, dst); err != nil {
45+
b.Fatalf("net.PacketConn.WriteTo failed: %v", err)
46+
}
47+
if _, _, err := c.ReadFrom(rb); err != nil {
48+
b.Fatalf("net.PacketConn.ReadFrom failed: %v", err)
49+
}
50+
}
51+
52+
func BenchmarkReadWriteIPv4UDP(b *testing.B) {
53+
c, dst, err := benchmarkUDPListener()
54+
if err != nil {
55+
b.Fatalf("benchmarkUDPListener failed: %v", err)
56+
}
57+
defer c.Close()
58+
59+
p := ipv4.NewPacketConn(c)
60+
cf := ipv4.FlagTTL | ipv4.FlagInterface
61+
if err := p.SetControlMessage(cf, true); err != nil {
62+
b.Fatalf("ipv4.PacketConn.SetControlMessage failed: %v", err)
63+
}
64+
ifi := loopbackInterface()
65+
66+
wb, rb := []byte("HELLO-R-U-THERE"), make([]byte, 128)
67+
b.ResetTimer()
68+
for i := 0; i < b.N; i++ {
69+
benchmarkReadWriteIPv4UDP(b, p, wb, rb, dst, ifi)
70+
}
71+
}
72+
73+
func benchmarkReadWriteIPv4UDP(b *testing.B, p *ipv4.PacketConn, wb, rb []byte, dst net.Addr, ifi *net.Interface) {
74+
cm := ipv4.ControlMessage{TTL: 1}
75+
if ifi != nil {
76+
cm.IfIndex = ifi.Index
77+
}
78+
if _, err := p.WriteTo(wb, &cm, dst); err != nil {
79+
b.Fatalf("ipv4.PacketConn.WriteTo failed: %v", err)
80+
}
81+
if _, _, _, err := p.ReadFrom(rb); err != nil {
82+
b.Fatalf("ipv4.PacketConn.ReadFrom failed: %v", err)
83+
}
84+
}
85+
1686
func TestReadWriteUnicastIPPayloadUDP(t *testing.T) {
1787
c, err := net.ListenPacket("udp4", "127.0.0.1:0")
1888
if err != nil {

0 commit comments

Comments
 (0)