- array_sum: documentation ( source)
- microtime: documentation ( source)
- array_shift: documentation ( source)
- strrev: documentation ( source)
- array_pop: documentation ( source)
- printf: documentation ( source)
<?php
/**
* strrev function implementation taken from ext/standard/string.c PHP-5-5 branch
* http://lxr.php.net/xref/PHP_5_5/ext/standard/string.c#3165
*
* // {{{ proto string strrev(string str)
* // Reverse a string
* PHP_FUNCTION(strrev)
* {
* char *str;
* char *e, *n, *p;
* int str_len;
*
* if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &str, &str_len) == FAILURE) {
* return;
* }
*
* n = emalloc(str_len+1);
* p = n;
*
* e = str + str_len;
*
* while (--e>=str) {
* *p++ = *e;
* }
*
* *p = '\0';
*
* RETVAL_STRINGL(n, str_len, 0);
* }
* // }}}
*/
// PHP Implementation
function userland_strrev($string) {
if (!is_string($string)) {
return false;
}
$new_string = "";
$len = strlen($string);
while (--$len > -1) {
$new_string .= $string[$len];
}
return $new_string;
}
// Tests
$string = "Hello PHP!";
$c = 10000;
// Without callable string resolution
$results = array();
for ($i = 0; $i < $c; $i++) {
$t = microtime(true);
strrev($string);
$results[$test][] = microtime(true) - $t;
}
array_shift($results[$test]);
array_pop($results[$test]);
$avg = array_sum($results[$test]) / count($results[$test]);
printf("Average cost for function strrev: %.9f s\n", $avg);
$results = array();
for ($i = 0; $i < $c; $i++) {
$t = microtime(true);
userland_strrev($string);
$results[$test][] = microtime(true) - $t;
}
array_shift($results[$test]);
array_pop($results[$test]);
$avg = array_sum($results[$test]) / count($results[$test]);
printf("Average cost for function userland_strrev: %.9f s\n", $avg);