diff --git a/binding/csharp/IP2Region.SearchTest/Program.cs b/binding/csharp/IP2Region.SearchTest/Program.cs index 35267f2..eca95c0 100644 --- a/binding/csharp/IP2Region.SearchTest/Program.cs +++ b/binding/csharp/IP2Region.SearchTest/Program.cs @@ -1,10 +1,7 @@ using IP2Region.xdb; using System; -using System.Collections.Generic; using System.Diagnostics; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using System.IO; namespace IP2Region.SearchTest { @@ -65,7 +62,7 @@ namespace IP2Region.SearchTest String key = r.Substring(2, sIdx - 2); String val = r.Substring(sIdx + 1); - // System.out.printf("key=%s, val=%s\n", key, val); + // Console.WriteLinef("key=%s, val=%s\n", key, val); if ("db" == key) { dbPath = val; @@ -83,7 +80,7 @@ namespace IP2Region.SearchTest if (dbPath.Length < 1) { - Console.WriteLine("jSearchTest.exe search [command options]"); + Console.WriteLine("SearchTest.exe search [command options]"); Console.WriteLine("options:"); Console.WriteLine(" --db string ip2region binary xdb file path"); Console.WriteLine(" --cache-policy string cache policy: file/vectorIndex/content"); @@ -118,7 +115,117 @@ namespace IP2Region.SearchTest } public static void BenchTest(String[] args) { + String dbPath = "", srcPath = "", cachePolicy = "vectorIndex"; + foreach (String r in args) + { + if (r.Length < 5) + { + continue; + } + if (r.IndexOf("--") != 0) + { + continue; + } + + int sIdx = r.IndexOf('='); + if (sIdx < 0) + { + Console.WriteLine("missing = for args pair `{0}`", r); + return; + } + + String key = r.Substring(2, sIdx - 2); + String val = r.Substring(sIdx + 1); + if ("db" == key) + { + dbPath = val; + } + else if ("src" == key) + { + srcPath = val; + } + else if ("cache-policy" == key) + { + cachePolicy = val; + } + else + { + Console.WriteLine("undefined option `{0}`", r); + return; + } + } + + if (dbPath.Length < 1 || srcPath.Length < 1) + { + Console.WriteLine("SearchTest.exe bench [command options]"); + Console.WriteLine("options:"); + Console.WriteLine(" --db string ip2region binary xdb file path"); + Console.WriteLine(" --src string source ip text file path"); + Console.WriteLine(" --cache-policy string cache policy: file/vectorIndex/content"); + return; + } + + Searcher searcher = CreateSearcher(dbPath, cachePolicy); + long count = 0; + var sw = new Stopwatch(); + var lines = File.ReadAllLines(srcPath); + foreach (var line in lines) + { + String l = line.Trim(); + String[] ps = l.Split(new[] { '|' }, 3); + if (ps.Length != 3) + { + Console.WriteLine("invalid ip segment `{0}`", l); + return; + } + long sip; + try + { + sip = Searcher.checkIP(ps[0]); + } + catch (Exception e) + { + Console.WriteLine("check start ip `{0}`: {1}", ps[0], e); + return; + } + long eip; + try + { + eip = Searcher.checkIP(ps[1]); + } + catch (Exception e) + { + Console.WriteLine("check end ip `{0}`: {1}", ps[1], e); + return; + } + + if (sip > eip) + { + Console.WriteLine("start ip({0}) should not be greater than end ip({1})", ps[0], ps[1]); + return; + } + + long mip = (sip + eip) >> 1; + foreach (var ip in new long[] { sip, (sip + mip) >> 1, mip, (mip + eip) >> 1, eip }) + { + sw.Start(); + String region = searcher.Search(ip); + sw.Stop(); + // check the region info + if (ps[2] != (region)) + { + Console.WriteLine("failed search({0}) with ({1} != {2})\n", Searcher.Long2ip(ip), region, ps[2]); + return; + } + + count++; + } + } + + Console.WriteLine("Bench finished, {{cachePolicy: {0}, total: {1}, took: {2}, cost: {3} ms/op}}", + cachePolicy, count, sw.Elapsed, + count == 0 ? 0 : sw.ElapsedMilliseconds / count); } static void Main(string[] args) {