RE: [PHP-QA] cvs: php-benchmarks / bench.php

From: Date: Mon, 25 May 2009 13:17:23 +0000
Subject: RE: [PHP-QA] cvs: php-benchmarks / bench.php
References: 1 2  Groups: php.qa 
Request: Send a blank email to php-qa+get-65011@lists.php.net to get a copy of this message
Hi! Thanks for the comments. However, I've heard that there might be portability problems with getopt, that it shouldn't work on windows. The other idea could be to use the pear extension, console_getargs instead. Do you know how it is with portability of getopt? I'll remember to not use ereg and split and remove them from usage. Thanks -----Original Message----- From: Nuno Lopes [mailto:nlopess@php.net] Sent: den 24 maj 2009 20:39 To: Alexander Hjalmarsson; php-qa@lists.php.net Subject: Re: [PHP-QA] cvs: php-benchmarks / bench.php It seems tha everyone is on-line and they've already provided great feedback. Let me just add that *ereg() and split() functions shouldn't be used. Please use the pcre extension instead. Also, take a look to the http://php.net/getopt function to simplify the code to parse command-line arguments. Nuno ----- Original Message ----- From: "Alexander Hjalmarsson" <hjalle@php.net> To: <php-qa@lists.php.net> Sent: Sunday, May 24, 2009 6:45 PM Subject: [PHP-QA] cvs: php-benchmarks / bench.php > hjalle Sun May 24 17:45:11 2009 UTC > > Added files: > /php-benchmarks bench.php > Log: > > Main structure of the CLI-benchmark > > > > > http://cvs.php.net/viewvc.cgi/php-benchmarks/bench.php?view=markup&rev=1.1 > Index: php-benchmarks/bench.php > +++ php-benchmarks/bench.php > <?php > /** > * Handles output and logging options. > * @param $msg The message to be handled > * @param $print Whether it should be printed > * or not. > * @param $log File to log the output to. > * Set to false if logging is > * disabled. > */ > function console($msg,$print = true) > { > if(VERBOSE == true) > { > if($print == true) > { > echo $msg; > } > > } > if(LOG_FILE != false && $print) > { > $fp = fopen(LOG_FILE,'a'); > fwrite($fp,$msg); > fclose($fp); > } > } > /** > * Return an array with all the paths to the test files found > * from the array of directories to search. > * Returning array have this structure: > * array("/path/to/test/test_name.php)" => "name.php",...,); > * @param $test_dirs An array of directories to search in > * @return Array of test files and their names. > */ > function get_test_files($test_dirs) > { > $files = array(); > foreach($test_dirs as $dir) > { > foreach (glob("$dir/test_*.php") as $filename) { > $t['filename'] = $filename; > preg_match('/^'.preg_quote($dir,'/').'\/test_(.+)[.]php$/i', > $filename, > $matches); > $t['name'] = $matches[1]; > $files[] = $t; > } > } > > return $files; > } > /** > * Parses the arguments and returns them in a better structure. > * Flags enabled will get the value 1 and the arguments will get > * the value specified from the console. > * @param $argv The argument array ($argv) > * @param $flags Existing flag options > * @param $arguments Existing argument options > * @return If flags and arguments were correct, > * it will return an array with $key -> $value > * structure. > */ > function arguments($argv,$flags,$arguments) { > $ARGS = array(); > foreach ($argv as $arg) { > if (ereg('--[a-zA-Z0-9]*=.*',$arg)) { > $str = split("=",$arg); $arg = ''; > $key = ereg_replace("--",'',$str[0]); > for ( $i = 1; $i < count($str); $i++ ) { > $arg .= $str[$i]; > } > if(in_array($key,$arguments)) > $ARGS[$key] = $arg; > else{ > console("Illegal argument: ".$key); > usage(); > } > > } elseif(ereg('-[a-zA-Z0-9]',$arg)) { > $arg = ereg_replace("-",'',$arg); > if(in_array($arg,$flags)) > { > $ARGS[$arg] = true; > } > else > { > console("Illegal flag: ".$arg); > usage(); > } > } > > } > return $ARGS; > } > /** > * Prints help message and exits. > */ > function usage() > { > console(<<<EOL > bench.php - Runs a sequence of algorithms to measure performance > > Usage: bench [OPTIONS] > > Options: > --help Print help message > -h > > -debug Debug mode. If combined with logging, > debug output will come to the log as well. > > --m=MEM Sets the maximum allowed memory to MEM, > default is 128. > > --include=DIR Includes DIR as a test directory. Files > with the filename structure of test_*.php > in this directory will be included in the > benchmark. Multiple directories can be > separated by commas (DIR,DIR,...,DIR). > > --log=FILE Logs output to FILE. Can be combined with > -debug. > > -q Sets benchmark to run quite. > EOL > ); > die(); > } > > error_reporting(E_ALL | E_STRICT); > set_time_limit(0); > > include("misc/timer.php"); > $arguments = > array("m","include","php","log","help"); > $flags = array("debug","q"); > $MEMORY_LIMIT = 128; > $DEBUG = false; > $VERBOSE = true; > $test_dirs = array('tests'); > $LOG_FILE = false; > $PHP = "php"; > $user_arguments = arguments($argv,$flags,$arguments); > > foreach($user_arguments as $arg => $value) > { > switch($arg) > { > case 'm': $MEMORY_LIMIT = $value; break; > case 'debug': $DEBUG = true; break; > case 'include': > $dirs = explode(",",$value); > > foreach($dirs as $dir) > { > if($dir[strlen($dir)-1] == "/") > $test_dirs[] = substr($dir,0,strlen($dir)-1); > else > $test_dirs[] = $dir; > } > break; > case 'h': usage(); break; > case 'help': usage(); break; > case 'php': $PHP = $value; break; > case 'log':$LOG_FILE = $value; > break; > case 'q': $VERBOSE = false; break; > } > } > > $tests_list = array(); > $results = array(); > define("VERBOSE",$VERBOSE); > define("DEBUG",$DEBUG); > define("LOG_FILE",$LOG_FILE); > $tests_list = get_test_files($test_dirs); > $length = 1; > $timer = new Timer(); > $total = 0; > $datetime = date("Y-m-d H:i:s",time()); > console("--------------- Bench.php ".$datetime."---------------------\n"); > foreach($tests_list as $test) > { > $cmd = "$PHP -d memory_limit={$MEMORY_LIMIT}M ".$test['filename']; > console("$cmd\n",DEBUG); > $timer->start(); > $deb = $cmd; > $timer->stop(); > console($deb,DEBUG); > console("Results from ".$test['name'].": > ".$timer->elapsed."\n"); > $total += $timer->elapsed; > > > } > console("Total time for the benchmark: ".$total." seconds\n"); > console("-------------- END ".$datetime."----------------------------\n"); > > ?>

« previous php.qa (#65011) next »