addOption( 'count', 'How many times to run a benchmark', false, true ); } public function bench( array $benchs ) { $count = $this->getOption( 'count', $this->defaultCount ); foreach ( $benchs as $key => $bench ) { // Default to no arguments if ( !isset( $bench['args'] ) ) { $bench['args'] = []; } // Optional setup called outside time measure if ( isset( $bench['setup'] ) ) { call_user_func( $bench['setup'] ); } $start = microtime( true ); for ( $i = 0; $i < $count; $i++ ) { call_user_func_array( $bench['function'], $bench['args'] ); } $delta = microtime( true ) - $start; // Name defaults to name of called function if ( is_string( $key ) ) { $name = $key; } else { if ( is_array( $bench['function'] ) ) { $name = get_class( $bench['function'][0] ) . '::' . $bench['function'][1]; } else { $name = strval( $bench['function'] ); } $name = sprintf( "%s(%s)", $name, implode( ', ', $bench['args'] ) ); } $this->results[] = [ 'name' => $name, 'count' => $count, 'total' => $delta, 'average' => $delta / $count, ]; } } public function getFormattedResults() { $ret = sprintf( "Running PHP version %s (%s) on %s %s %s\n\n", phpversion(), php_uname( 'm' ), php_uname( 's' ), php_uname( 'r' ), php_uname( 'v' ) ); foreach ( $this->results as $res ) { // show function with args $ret .= sprintf( "%s times: %s\n", $res['count'], $res['name'] ); $ret .= sprintf( " %6.2fms (%6.4fms each)\n", $res['total'] * 1e3, $res['average'] * 1e3 ); } return $ret; } }