From 0ad88a481de7aeba15e5a8b3ee5af7141396b082 Mon Sep 17 00:00:00 2001 From: Mikio Hara Date: Fri, 22 Feb 2013 01:19:04 +0900 Subject: [PATCH] net: add benchmarks for network interface identification Current results on linux/amd64: BenchmarkInterfaces 20000 80902 ns/op BenchmarkInterfaceByIndex 50000 71591 ns/op BenchmarkInterfaceByName 20000 79908 ns/op BenchmarkInterfaceAddrs 2000 836413 ns/op BenchmarkInterfacesAndAddrs 5000 605946 ns/op BenchmarkInterfacesAndMulticastAddrs 10000 169029 ns/op Update #4866. R=golang-dev, bradfitz CC=golang-dev https://golang.org/cl/7368046 --- src/pkg/net/interface_test.go | 83 ++++++++++++++++++++++++++++++++++- 1 file changed, 81 insertions(+), 2 deletions(-) diff --git a/src/pkg/net/interface_test.go b/src/pkg/net/interface_test.go index 803c1f4495..0b75f97ce9 100644 --- a/src/pkg/net/interface_test.go +++ b/src/pkg/net/interface_test.go @@ -9,6 +9,21 @@ import ( "testing" ) +// LoopbackInterface returns a logical network interface for loopback +// tests. +func loopbackInterface() *Interface { + ift, err := Interfaces() + if err != nil { + return nil + } + for _, ifi := range ift { + if ifi.Flags&FlagLoopback != 0 && ifi.Flags&FlagUp != 0 { + return &ifi + } + } + return nil +} + func sameInterface(i, j *Interface) bool { if i == nil || j == nil { return false @@ -29,10 +44,10 @@ func TestInterfaces(t *testing.T) { for _, ifi := range ift { ifxi, err := InterfaceByIndex(ifi.Index) if err != nil { - t.Fatalf("InterfaceByIndex(%q) failed: %v", ifi.Index, err) + t.Fatalf("InterfaceByIndex(%v) failed: %v", ifi.Index, err) } if !sameInterface(ifxi, &ifi) { - t.Fatalf("InterfaceByIndex(%q) = %v, want %v", ifi.Index, *ifxi, ifi) + t.Fatalf("InterfaceByIndex(%v) = %v, want %v", ifi.Index, *ifxi, ifi) } ifxn, err := InterfaceByName(ifi.Name) if err != nil { @@ -102,3 +117,67 @@ func testMulticastAddrs(t *testing.T, ifmat []Addr) { } } } + +func BenchmarkInterfaces(b *testing.B) { + for i := 0; i < b.N; i++ { + if _, err := Interfaces(); err != nil { + b.Fatalf("Interfaces failed: %v", err) + } + } +} + +func BenchmarkInterfaceByIndex(b *testing.B) { + ifi := loopbackInterface() + if ifi == nil { + return + } + for i := 0; i < b.N; i++ { + if _, err := InterfaceByIndex(ifi.Index); err != nil { + b.Fatalf("InterfaceByIndex failed: %v", err) + } + } +} + +func BenchmarkInterfaceByName(b *testing.B) { + ifi := loopbackInterface() + if ifi == nil { + return + } + for i := 0; i < b.N; i++ { + if _, err := InterfaceByName(ifi.Name); err != nil { + b.Fatalf("InterfaceByName failed: %v", err) + } + } +} + +func BenchmarkInterfaceAddrs(b *testing.B) { + for i := 0; i < b.N; i++ { + if _, err := InterfaceAddrs(); err != nil { + b.Fatalf("InterfaceAddrs failed: %v", err) + } + } +} + +func BenchmarkInterfacesAndAddrs(b *testing.B) { + ifi := loopbackInterface() + if ifi == nil { + return + } + for i := 0; i < b.N; i++ { + if _, err := ifi.Addrs(); err != nil { + b.Fatalf("Interface.Addrs failed: %v", err) + } + } +} + +func BenchmarkInterfacesAndMulticastAddrs(b *testing.B) { + ifi := loopbackInterface() + if ifi == nil { + return + } + for i := 0; i < b.N; i++ { + if _, err := ifi.MulticastAddrs(); err != nil { + b.Fatalf("Interface.MulticastAddrs failed: %v", err) + } + } +} -- 2.48.1