123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358 |
- <?php
- function hallo() {
- }
- function simpleucall($n) {
- for ($i = 0; $i < $n; $i++)
- hallo();
- }
- function simpleudcall($n) {
- for ($i = 0; $i < $n; $i++)
- hallo2();
- }
- function hallo2() {
- }
- function simpleicall($n) {
- for ($i = 0; $i < $n; $i++)
- func_num_args();
- }
- class Foo {
- static $a = 0;
- public $b = 0;
- const TEST = 0;
- static function read_static($n) {
- for ($i = 0; $i < $n; ++$i) {
- $x = self::$a;
- }
- }
- static function write_static($n) {
- for ($i = 0; $i < $n; ++$i) {
- self::$a = 0;
- }
- }
- static function isset_static($n) {
- for ($i = 0; $i < $n; ++$i) {
- $x = isset(self::$a);
- }
- }
- static function empty_static($n) {
- for ($i = 0; $i < $n; ++$i) {
- $x = empty(self::$a);
- }
- }
- static function f() {
- }
- static function call_static($n) {
- for ($i = 0; $i < $n; ++$i) {
- self::f();
- }
- }
- function read_prop($n) {
- for ($i = 0; $i < $n; ++$i) {
- $x = $this->b;
- }
- }
- function write_prop($n) {
- for ($i = 0; $i < $n; ++$i) {
- $this->b = 0;
- }
- }
- function assign_add_prop($n) {
- for ($i = 0; $i < $n; ++$i) {
- $this->b += 2;
- }
- }
- function pre_inc_prop($n) {
- for ($i = 0; $i < $n; ++$i) {
- ++$this->b;
- }
- }
- function pre_dec_prop($n) {
- for ($i = 0; $i < $n; ++$i) {
- --$this->b;
- }
- }
- function post_inc_prop($n) {
- for ($i = 0; $i < $n; ++$i) {
- $this->b++;
- }
- }
- function post_dec_prop($n) {
- for ($i = 0; $i < $n; ++$i) {
- $this->b--;
- }
- }
- function isset_prop($n) {
- for ($i = 0; $i < $n; ++$i) {
- $x = isset($this->b);
- }
- }
- function empty_prop($n) {
- for ($i = 0; $i < $n; ++$i) {
- $x = empty($this->b);
- }
- }
- function g() {
- }
- function call($n) {
- for ($i = 0; $i < $n; ++$i) {
- $this->g();
- }
- }
- function read_const($n) {
- for ($i = 0; $i < $n; ++$i) {
- $x = $this::TEST;
- }
- }
- }
- function read_static($n) {
- for ($i = 0; $i < $n; ++$i) {
- $x = Foo::$a;
- }
- }
- function write_static($n) {
- for ($i = 0; $i < $n; ++$i) {
- Foo::$a = 0;
- }
- }
- function isset_static($n) {
- for ($i = 0; $i < $n; ++$i) {
- $x = isset(Foo::$a);
- }
- }
- function empty_static($n) {
- for ($i = 0; $i < $n; ++$i) {
- $x = empty(Foo::$a);
- }
- }
- function call_static($n) {
- for ($i = 0; $i < $n; ++$i) {
- Foo::f();
- }
- }
- function create_object($n) {
- for ($i = 0; $i < $n; ++$i) {
- $x = new Foo();
- }
- }
- define('TEST', null);
- function read_const($n) {
- for ($i = 0; $i < $n; ++$i) {
- $x = TEST;
- }
- }
- function read_auto_global($n) {
- for ($i = 0; $i < $n; ++$i) {
- $x = $_GET;
- }
- }
- $g_var = 0;
- function read_global_var($n) {
- for ($i = 0; $i < $n; ++$i) {
- $x = $GLOBALS['g_var'];
- }
- }
- function read_hash($n) {
- $hash = array('test' => 0);
- for ($i = 0; $i < $n; ++$i) {
- $x = $hash['test'];
- }
- }
- function read_str_offset($n) {
- $str = "test";
- for ($i = 0; $i < $n; ++$i) {
- $x = $str[1];
- }
- }
- function issetor($n) {
- $val = array(0,1,2,3,4,5,6,7,8,9);
- for ($i = 0; $i < $n; ++$i) {
- $x = $val ?: null;
- }
- }
- function issetor2($n) {
- $f = false; $j = 0;
- for ($i = 0; $i < $n; ++$i) {
- $x = $f ?: $j + 1;
- }
- }
- function ternary($n) {
- $val = array(0,1,2,3,4,5,6,7,8,9);
- $f = false;
- for ($i = 0; $i < $n; ++$i) {
- $x = $f ? null : $val;
- }
- }
- function ternary2($n) {
- $f = false; $j = 0;
- for ($i = 0; $i < $n; ++$i) {
- $x = $f ? $f : $j + 1;
- }
- }
- /*****/
- function empty_loop($n) {
- for ($i = 0; $i < $n; ++$i) {
- }
- }
- function gethrtime()
- {
- $hrtime = hrtime();
- return (($hrtime[0]*1000000000 + $hrtime[1]) / 1000000000);
- }
- function start_test()
- {
- ob_start();
- return gethrtime();
- }
- function end_test($start, $name, $overhead = null)
- {
- global $total;
- global $last_time;
- $end = gethrtime();
- ob_end_clean();
- $last_time = $end-$start;
- $total += $last_time;
- $num = number_format($last_time,3);
- $pad = str_repeat(" ", 24-strlen($name)-strlen($num));
- if (is_null($overhead)) {
- echo $name.$pad.$num."\n";
- } else {
- $num2 = number_format($last_time - $overhead,3);
- echo $name.$pad.$num." ".$num2."\n";
- }
- ob_start();
- return gethrtime();
- }
- function total()
- {
- global $total;
- $pad = str_repeat("-", 24);
- echo $pad."\n";
- $num = number_format($total,3);
- $pad = str_repeat(" ", 24-strlen("Total")-strlen($num));
- echo "Total".$pad.$num."\n";
- }
- const N = 5000000;
- $t0 = $t = start_test();
- empty_loop(N);
- $t = end_test($t, 'empty_loop');
- $overhead = $last_time;
- simpleucall(N);
- $t = end_test($t, 'func()', $overhead);
- simpleudcall(N);
- $t = end_test($t, 'undef_func()', $overhead);
- simpleicall(N);
- $t = end_test($t, 'int_func()', $overhead);
- Foo::read_static(N);
- $t = end_test($t, '$x = self::$x', $overhead);
- Foo::write_static(N);
- $t = end_test($t, 'self::$x = 0', $overhead);
- Foo::isset_static(N);
- $t = end_test($t, 'isset(self::$x)', $overhead);
- Foo::empty_static(N);
- $t = end_test($t, 'empty(self::$x)', $overhead);
- read_static(N);
- $t = end_test($t, '$x = Foo::$x', $overhead);
- write_static(N);
- $t = end_test($t, 'Foo::$x = 0', $overhead);
- isset_static(N);
- $t = end_test($t, 'isset(Foo::$x)', $overhead);
- empty_static(N);
- $t = end_test($t, 'empty(Foo::$x)', $overhead);
- Foo::call_static(N);
- $t = end_test($t, 'self::f()', $overhead);
- call_static(N);
- $t = end_test($t, 'Foo::f()', $overhead);
- $x = new Foo();
- $x->read_prop(N);
- $t = end_test($t, '$x = $this->x', $overhead);
- $x->write_prop(N);
- $t = end_test($t, '$this->x = 0', $overhead);
- $x->assign_add_prop(N);
- $t = end_test($t, '$this->x += 2', $overhead);
- $x->pre_inc_prop(N);
- $t = end_test($t, '++$this->x', $overhead);
- $x->pre_dec_prop(N);
- $t = end_test($t, '--$this->x', $overhead);
- $x->post_inc_prop(N);
- $t = end_test($t, '$this->x++', $overhead);
- $x->post_dec_prop(N);
- $t = end_test($t, '$this->x--', $overhead);
- $x->isset_prop(N);
- $t = end_test($t, 'isset($this->x)', $overhead);
- $x->empty_prop(N);
- $t = end_test($t, 'empty($this->x)', $overhead);
- $x->call(N);
- $t = end_test($t, '$this->f()', $overhead);
- $x->read_const(N);
- $t = end_test($t, '$x = Foo::TEST', $overhead);
- create_object(N);
- $t = end_test($t, 'new Foo()', $overhead);
- read_const(N);
- $t = end_test($t, '$x = TEST', $overhead);
- read_auto_global(N);
- $t = end_test($t, '$x = $_GET', $overhead);
- read_global_var(N);
- $t = end_test($t, '$x = $GLOBALS[\'v\']', $overhead);
- read_hash(N);
- $t = end_test($t, '$x = $hash[\'v\']', $overhead);
- read_str_offset(N);
- $t = end_test($t, '$x = $str[0]', $overhead);
- issetor(N);
- $t = end_test($t, '$x = $a ?: null', $overhead);
- issetor2(N);
- $t = end_test($t, '$x = $f ?: tmp', $overhead);
- ternary(N);
- $t = end_test($t, '$x = $f ? $f : $a', $overhead);
- ternary2(N);
- $t = end_test($t, '$x = $f ? $f : tmp', $overhead);
- total($t0, "Total");
|