From d482335ca2be95a6951e3bd49471981917a639ff Mon Sep 17 00:00:00 2001 From: Lion Date: Wed, 22 Jun 2022 18:49:02 +0800 Subject: [PATCH] add bench test script --- binding/php/XdbSearcher.class.php | 4 +- binding/php/bench_test.php | 174 ++++++++++++++++++++++++++++++ binding/php/search_test.php | 28 ++--- 3 files changed, 192 insertions(+), 14 deletions(-) create mode 100644 binding/php/bench_test.php diff --git a/binding/php/XdbSearcher.class.php b/binding/php/XdbSearcher.class.php index b2a2e81..5a938ba 100644 --- a/binding/php/XdbSearcher.class.php +++ b/binding/php/XdbSearcher.class.php @@ -100,7 +100,7 @@ class XdbSearcher // check and convert the sting ip to a 4-bytes long if (is_string($ip)) { $t = self::ip2long($ip); - if ($t === false) { + if ($t === null) { throw new Exception("invalid ip address `$ip`"); } $ip = $t; @@ -208,7 +208,7 @@ class XdbSearcher { $ip = ip2long($ip); if ($ip === false) { - return false; + return null; } // convert signed int to unsigned int if on 32 bit operating system diff --git a/binding/php/bench_test.php b/binding/php/bench_test.php new file mode 100644 index 0000000..b37d1e3 --- /dev/null +++ b/binding/php/bench_test.php @@ -0,0 +1,174 @@ + +// @Date 2022/06/22 + +require dirname(__FILE__) . '/XdbSearcher.class.php'; + +function printHelp($argv) { + printf("php %s [command options]\n", $argv[0]); + printf("options: \n"); + printf(" --db string ip2region binary xdb file path\n"); + printf(" --src string source ip text file path\n"); + printf(" --cache-policy string cache policy: file/vectorIndex/content\n"); +} + +if($argc < 2) { + printHelp($argv); + return; +} + +$dbFile = ""; +$srcFile = ""; +$cachePolicy = 'vectorIndex'; +array_shift($argv); +foreach ($argv as $r) { + if (strlen($r) < 5) { + continue; + } + + if (strpos($r, '--') != 0) { + continue; + } + + $sIdx = strpos($r, "="); + if ($sIdx < 0) { + printf("missing = for args pair %s\n", $r); + return; + } + + $key = substr($r, 2, $sIdx - 2); + $val = substr($r, $sIdx + 1); + if ($key == 'db') { + $dbFile = $val; + } else if ($key == 'src') { + $srcFile = $val; + } else if ($key == 'cache-policy') { + $cachePolicy = $val; + } else { + printf("undefined option `%s`\n", $r); + return; + } +} + +if (strlen($dbFile) < 1 || strlen($srcFile) < 1) { + printHelp($argv); + return; +} + +// printf("debug: dbFile: %s, cachePolicy: %s\n", $dbFile, $cachePolicy); +// create the xdb searcher by the cache-policy +switch ( $cachePolicy ) { + case 'file': + try { + $searcher = XdbSearcher::newWithFileOnly($dbFile); + } catch (Exception $e) { + printf("failed to create searcher with '%s': %s\n", $dbFile, $e); + return; + } + break; + case 'vectorIndex': + $vIndex = XdbSearcher::loadVectorIndexFromFile($dbFile); + if ($vIndex == null) { + printf("failed to load vector index from '%s'\n", $dbFile); + return; + } + + try { + $searcher = XdbSearcher::newWithVectorIndex($dbFile, $vIndex); + } catch (Exception $e) { + printf("failed to create vector index cached searcher with '%s': %s\n", $dbFile, $e); + return; + } + break; + case 'content': + $cBuff = XdbSearcher::loadContentFromFile($dbFile); + if ($cBuff == null) { + printf("failed to load xdb content from '%s'\n", $dbFile); + return; + } + + try { + $searcher = XdbSearcher::newWithBuffer($cBuff); + } catch (Exception $e) { + printf("failed to create content cached searcher: %s", $e); + return; + } + break; + default: + printf("undefined cache-policy `%s`\n", $cachePolicy); + return; +} + + +// do the bench test +$handle = fopen($srcFile, "r"); +if ($handle === false) { + printf("failed to open source text file `%s`\n", $srcFile); + return null; +} + +$count = 0; +$sTime = XdbSearcher::now(); +while (!feof($handle)) { + $line = trim(fgets($handle, 1024)); + if (strlen($line) < 1) { + continue; + } + + $ps = explode('|', $line, 3); + if (count($ps) != 3) { + printf("invalid ip segment line `${line}`\n"); + return; + } + + $sip = XdbSearcher::ip2long($ps[0]); + if ($sip === null) { + printf("invalid start ip `%s`\n", $ps[0]); + return; + } + + $eip = XdbSearcher::ip2long($ps[1]); + if ($eip === null) { + printf("invalid end ip `%s`\n", $ps[1]); + return; + } + + if ($sip > $eip) { + printf("start ip(%s) should not be greater than end ip(%s)\n", $ps[0], $ps[1]); + return; + } + + $mip = ($sip + $eip) >> 1; + foreach ([$sip, ($sip + $mip) >> 1, $mip, ($mip + $eip) >> 1, $eip] as $ip) { + try { + $region = $searcher->search($ip); + } catch (Exception $e) { + printf("failed to search ip `%s`\n", long2ip($ip)); + return; + } + + if ($region == null) { + printf("failed to search ip `%s`\n", long2ip($ip)); + return; + } + + // check the region info + if ($region != $ps[2]) { + printf("failed search(%s) with (%s != %s)\n", long2ip($ip), $region, $ps[2]); + return; + } + + $count++; + } +} + +// close the searcher at last +fclose($handle); +$searcher->close(); +$cost = XdbSearcher::now() - $sTime; +printf("Bench finished, {cachePolicy: %s, total: %d, took: %ds, cost: %.3f ms/op}\n", + $cachePolicy, $count, $cost/1000, $cost/$count); \ No newline at end of file diff --git a/binding/php/search_test.php b/binding/php/search_test.php index 6388262..1a65036 100644 --- a/binding/php/search_test.php +++ b/binding/php/search_test.php @@ -8,16 +8,20 @@ require dirname(__FILE__) . '/XdbSearcher.class.php'; -if($argc < 2) { +function printHelp($argv) { printf("php %s [command options]\n", $argv[0]); printf("options: \n"); printf(" --db string ip2region binary xdb file path\n"); printf(" --cache-policy string cache policy: file/vectorIndex/content\n"); +} + +if($argc < 2) { + printHelp($argv); return; } $dbFile = ""; -$cachePolicy = isset($argv[2]) ? $argv[2] : 'vectorIndex'; +$cachePolicy = 'vectorIndex'; array_shift($argv); foreach ($argv as $r) { if (strlen($r) < 5) { @@ -46,9 +50,13 @@ foreach ($argv as $r) { } } +if (strlen($dbFile) < 1) { + printHelp($argv); + return; +} + // printf("debug: dbFile: %s, cachePolicy: %s\n", $dbFile, $cachePolicy); // create the xdb searcher by the cache-policy -$searcher = null; switch ( $cachePolicy ) { case 'file': try { @@ -103,12 +111,12 @@ while ( true ) { break; } - if (XdbSearcher::ip2long($line) === false) { + if (XdbSearcher::ip2long($line) === null) { echo "Error: invalid ip address\n"; continue; } - $sTime = getTime(); + $sTime = XdbSearcher::now(); try { $region = $searcher->search($line); } catch (Exception $e) { @@ -116,14 +124,10 @@ while ( true ) { continue; } - printf("{region: %s, ioCount: %d, took: %.5f ms}\n", $region, $searcher->getIOCount(), getTime() - $sTime); + printf("{region: %s, ioCount: %d, took: %.5f ms}\n", + $region, $searcher->getIOCount(), XdbSearcher::now() - $sTime); } // close the searcher at last $searcher->close(); -printf("searcher test program exited, thanks for trying\n"); - -function getTime() -{ - return (microtime(true) * 1000); -} +printf("searcher test program exited, thanks for trying\n"); \ No newline at end of file