====== Request for Comments: TSRMLS_FETCH() reduction ====== * Version: 1.0 * Date: 2010-09-09 * Author: Felipe Pena , Pierre Alain Joye * Status: Under implementation ===== Introduction ===== The purpose of RFC is to show a way to reduce several function call by avoiding useless TSRMLS_FETCH() usage on ZTS. Adding TSRMLS_CC to the memory allocation macros/function, hash api, zend_llist and streams. ===== Changes ====== See below some macros/functions will be added by the patch. ^ Current function/macro ^ New function/macro ^ | emalloc | emalloc2 | | ecalloc | ecalloc2 | | pemalloc | pemalloc2 | | erealloc | erealloc2 | | efree | efree2 | | estrdup | estrdup2 | | estrndup | estrndup2 | ===== Profiler ===== Using cachegrind (//valgrind --tool=cachegrind --cachegrind-out-file=profile sapi/cli/php Zend/bench.php//) to see the improvement, we can see the follow differences: ^ Function ^ Ir (Patched) ^ Ir (Current) ^ | pthread_getspecific | 498,129,021 | 1,269,764,085 | | ts_resource_ex | 394,353,075 | 1,005,230,834 | | efree | 459,940,754 | 840,217,602 | ^ Ir Total (Patched) ^ Ir Total (Current) ^ | 42,537,064,394 | 44,080,331,320 | // Ir - Instruction read // ===== Benchmark ===== ==== Zend/bench.php ==== ^ Zend/bench.php ^ Patched ^ Current ^ | simple | 0.487 | 0.562 | | simplecall | 1.697 | 1.971 | | simpleucall | 1.827 | 2.152 | | simpleudcall | 1.879 | 2.198 | | mandel | 1.950 | 2.286 | | mandel2 | 3.001 | 3.719 | | ackermann(7) | 1.426 | 1.874 | | ary(50000) | 0.260 | 0.256 | | ary2(50000) | 0.201 | 0.239 | | ary3(2000) | 1.506 | 1.758 | | fibo(30) | 5.065 | 5.618 | | hash1(50000) | 0.335 | 0.364 | | hash2(500) | 0.295 | 0.369 | | heapsort(20000) | 0.791 | 0.925 | | matrix(20) | 0.697 | 0.765 | | nestedloop(12) | 0.921 | 0.976 | | sieve(30) | 1.077 | 1.146 | | strcat(200000) | 0.130 | 0.148 | | Total | 23.547 | 27.328 | ==== Zend/microbench.php ==== **Patched** empty_loop 0.810 func() 3.588 2.778 undef_func() 3.775 2.965 int_func() 3.651 2.841 $x = self::$x 2.108 1.297 self::$x = 0 1.878 1.067 isset(self::$x) 1.676 0.865 empty(self::$x) 1.754 0.944 $x = Foo::$x 1.830 1.019 Foo::$x = 0 1.746 0.936 isset(Foo::$x) 1.543 0.733 empty(Foo::$x) 1.673 0.863 self::f() 3.764 2.954 Foo::f() 3.581 2.770 $x = $this->x 2.161 1.351 $this->x = 0 3.719 2.909 $this->x += 2 1.863 1.053 ++$this->x 1.547 0.737 --$this->x 1.665 0.855 $this->x++ 1.524 0.714 $this->x-- 1.532 0.722 isset($this->x) 1.726 0.915 empty($this->x) 1.891 1.081 $this->f() 4.151 3.341 $x = Foo::TEST 1.628 0.818 new Foo() 10.194 9.384 $x = TEST 1.327 0.517 $x = $_GET 2.167 1.357 $x = $GLOBALS['v'] 2.897 2.086 $x = $hash['v'] 2.034 1.224 $x = $str[0] 5.311 4.500 ------------------------ Total 80.712 **Current (trunk)** empty_loop 0.798 func() 3.634 2.836 undef_func() 3.633 2.836 int_func() 3.896 3.099 $x = self::$x 2.129 1.332 self::$x = 0 1.945 1.148 isset(self::$x) 1.755 0.958 empty(self::$x) 1.660 0.863 $x = Foo::$x 1.986 1.189 Foo::$x = 0 1.769 0.971 isset(Foo::$x) 1.556 0.759 empty(Foo::$x) 1.750 0.953 self::f() 4.268 3.470 Foo::f() 3.874 3.077 $x = $this->x 2.260 1.462 $this->x = 0 4.357 3.559 $this->x += 2 2.006 1.208 ++$this->x 1.658 0.860 --$this->x 1.643 0.846 $this->x++ 1.804 1.007 $this->x-- 1.818 1.021 isset($this->x) 1.832 1.035 empty($this->x) 2.050 1.253 $this->f() 4.537 3.739 $x = Foo::TEST 1.804 1.006 new Foo() 10.702 9.904 $x = TEST 1.558 0.760 $x = $_GET 2.274 1.476 $x = $GLOBALS['v'] 3.105 2.307 $x = $hash['v'] 1.939 1.141 $x = $str[0] 5.371 4.573 ------------------------ Total 85.372 ===== Patch ===== http://felipe.ath.cx/diff/tsrmls-fetch-reduction.diff ===== Changelog ===== 2010-09-09: Started.