From 064d7249f5cf8c09c0cb9b7e3978cc56295cc8ab Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Sun, 5 Nov 2017 23:39:47 +0100 Subject: [PATCH] banchmark IPNetTable --- common/net/ipnet_test.go | 73 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/common/net/ipnet_test.go b/common/net/ipnet_test.go index 5c22c8332..572c4ed18 100644 --- a/common/net/ipnet_test.go +++ b/common/net/ipnet_test.go @@ -2,8 +2,16 @@ package net_test import ( "net" + "os" + "path/filepath" "testing" + proto "github.com/golang/protobuf/proto" + "v2ray.com/core/app/router" + "v2ray.com/core/common/platform" + + "v2ray.com/ext/sysio" + "v2ray.com/core/common" . "v2ray.com/core/common/net" . "v2ray.com/ext/assert" @@ -43,3 +51,68 @@ func TestIPNet(t *testing.T) { assert(ipNet.Contains(ParseIP("2001:cdba::3257:9652")), IsFalse) assert(ipNet.Contains(ParseIP("91.108.255.254")), IsTrue) } + +func loadGeoIP(country string) ([]*router.CIDR, error) { + geoipBytes, err := sysio.ReadAsset("geoip.dat") + if err != nil { + return nil, err + } + var geoipList router.GeoIPList + if err := proto.Unmarshal(geoipBytes, &geoipList); err != nil { + return nil, err + } + + for _, geoip := range geoipList.Entry { + if geoip.CountryCode == country { + return geoip.Cidr, nil + } + } + + panic("country not found: " + country) +} + +func BenchmarkIPNetQuery(b *testing.B) { + common.Must(sysio.CopyFile(platform.GetAssetLocation("geoip.dat"), filepath.Join(os.Getenv("GOPATH"), "src", "v2ray.com", "core", "tools", "release", "config", "geoip.dat"))) + + ips, err := loadGeoIP("CN") + common.Must(err) + + ipNet := NewIPNetTable() + for _, ip := range ips { + ipNet.AddIP(ip.Ip, byte(ip.Prefix)) + } + + b.ResetTimer() + + for i := 0; i < b.N; i++ { + ipNet.Contains([]byte{8, 8, 8, 8}) + } +} + +func BenchmarkCIDRQuery(b *testing.B) { + common.Must(sysio.CopyFile(platform.GetAssetLocation("geoip.dat"), filepath.Join(os.Getenv("GOPATH"), "src", "v2ray.com", "core", "tools", "release", "config", "geoip.dat"))) + + ips, err := loadGeoIP("CN") + common.Must(err) + + ipNet := make([]*net.IPNet, 0, 1024) + for _, ip := range ips { + if len(ip.Ip) != 4 { + continue + } + ipNet = append(ipNet, &net.IPNet{ + IP: net.IP(ip.Ip), + Mask: net.CIDRMask(int(ip.Prefix), 32), + }) + } + + b.ResetTimer() + + for i := 0; i < b.N; i++ { + for _, n := range ipNet { + if n.Contains([]byte{8, 8, 8, 8}) { + break + } + } + } +}