PHP ã®éçºè
åãã¡ã¼ãªã³ã°ãªã¹ãã«ãJIT ã®éçºãå§ããã¨ããæ稿ãããã¾ãããPHP 8.0 ã¸ã®æè¼ãç®æ¨ã¨ãã¦éçºãé²ããããã§ãã
php.internals: JIT for PHP project
ããã§ãæ稿ã«æ¸ããã¦ãããã³ããã¼ã¯ãã¹ããç§ã®ç°å¢*1ã§ãå®è¡ãã¦ã¿ã¾ãããçµæã¯ä»¥ä¸ã®ã¨ããã§ããããããã 10 åã®å®è¡æéãå¹³åãããã®ã§ããå®è¡ãããã³ããã¼ã¯ããã°ã©ã 㯠PHP ã®ã½ã¼ã¹ã³ã¼ãã«å«ã¾ãã¦ãããã¤ã¯ããã³ããã¼ã¯ã§ããZend/bench.php (GitHub ãªãã¸ããª) ã§ã½ã¼ã¹ã³ã¼ãã確èªã§ãã¾ãã
左端ã®éè²ã®ç³»åã¯ã次æãã¤ãã¼ãªãªã¼ã¹ã® PHP 7.1.0 RC1 ã§å®è¡ãããã®ã§ãããã㯠JIT ãªãã§ã®å®è¡ã«ãªãã¾ãããã以å¤ã® 2 ç³»å㯠JIT ãæå¹ã«ãã¦å®è¡ãããã®ã§ããä¸å¤®ã®èæ©è²ã®ç³»åã¯ãã¡ã¼ãªã³ã°ãªã¹ãã«æ稿ãããæç¹ã§ã®ã³ã¼ã*2ã«ãããã®ã§ãå³ç«¯ã®æ©è²ã®ç³»åã¯ãç¾æç¹ã§ã®ææ°çã®ã³ã¼ã*3ã«ãããã®ã§ããã¡ã¼ãªã³ã°ãªã¹ãã«æ稿ãããå¾ãããã¤ãã®ã±ã¼ã¹ã«ã¤ãã¦å ·ä½ç㪠JIT æé©åãå®è£ ãããæ稿æãããé«éã«ãªã£ã¦ããããã§ãã
確èªæé
ãã³ããã¼ã¯ãã¹ãã®å®è¡æé ã«ã¤ãã¦èª¬æãã¾ããã¾ããGitHub ãªãã¸ããªããã½ã¼ã¹ã³ã¼ããåå¾ãã¾ãã
$ git clone -b jit-dynasm https://github.com/zendtech/php-src.git $ cd php-src
ç§ã確èªããæç¹ã§ã®ã³ããã (b5fa120) ã«ã¯ãã°ããã£ãã®ã§*4ããã«ãããåã«ã½ã¼ã¹ã³ã¼ããä¿®æ£ãã¾ã*5ãext/opcache/jit/zend_jit_x86.dasc ãéãã¦ä»¥ä¸ã® diff ã®é¨åãä¿®æ£ãã¾ã*6ã
--- a/ext/opcache/jit/zend_jit_x86.dasc +++ b/ext/opcache/jit/zend_jit_x86.dasc @@ -306,7 +306,7 @@ static int zend_jit_new(dasm_State **Dst, zend_op *opline) |.macro fp_op, fp_ins, op_type, op || if (op_type == IS_CONST) { | .if X64 -| mov aword EX->literals, r0 +| mov r0, aword EX->literals | fp_ins qword [r0 + op.constant] | .else | fp_ins qword [op.zv] @@ -345,7 +345,7 @@ static int zend_jit_new(dasm_State **Dst, zend_op *opline) |.macro sse_op, sse_ins, op_type, op, reg || if (op_type == IS_CONST) { | .if X64 -| mov aword EX->literals, r0 +| mov r0, aword EX->literals | sse_ins reg, qword [r0 + op.constant] | .else | sse_ins reg, qword [op.zv]
ãã¨ã¯é常ã©ãã PHP ããã«ããã¾ããconfigure ãªãã·ã§ã³ã¯ç¹ã«æå®ãã¾ããã§ããã
$ ./buildconf && ./configure && make
ãã³ããã¼ã¯ã®å®è¡æ¹æ³ã¯ä»¥ä¸ã®ã¨ããã§ããmake install ããã«å®è¡ãã¦ããã®ã§ãopcache.so ãèªã¿è¾¼ãããã«æ示çã«æå®ããå¿ è¦ãããã¾ããã¾ããCLI 㧠OPcache ãæå¹ã«ããããã« -dopcache.enable_cli=1 ã®æå®ãå¿ è¦ã§ãã
$ for i in $(seq 1 10); do ./sapi/cli/php -dzend_extension=$(pwd)/modules/opcache.so -dopcache.enable_cli=1 -dopcache.jit_buffer_size=32M Zend/bench.php; done
1 åãã¨ã®å®è¡çµæã¯ä»¥ä¸ã®ããã«åºåããã¾ããããã 10 ååç¶ãã¾ãã
simple 0.013 simplecall 0.004 simpleucall 0.004 simpleudcall 0.004 mandel 0.022 mandel2 0.033 ackermann(7) 0.025 ary(50000) 0.004 ary2(50000) 0.003 ary3(2000) 0.058 fibo(30) 0.097 hash1(50000) 0.017 hash2(500) 0.012 heapsort(20000) 0.024 matrix(20) 0.025 nestedloop(12) 0.039 sieve(30) 0.013 strcat(200000) 0.006 ------------------------ Total 0.404
éå»ã®ã³ããã (2fc7a09) ã«ã¤ãã¦ã¯ã該å½ã®ã³ãããã checkout ããå¾ãåæ§ã«ãã«ããã¦å®è¡ãã¾ãããã®ã³ãããã«å¯¾ãã¦ã¯ã½ã¼ã¹ã³ã¼ãã®ä¿®æ£ã¯ä¸è¦ã§ãã
$ git checkout 2fc7a09
PHP 7.1.0 RC1 ã«ã¤ãã¦ã¯ã以ä¸ã®ããã«å§ç¸®ãã¡ã¤ã«*7ãåå¾ãã¦ãã«ããå®è¡ãã¾ããã
$ wget https://downloads.php.net/~davey/php-7.1.0RC1.tar.bz2 $ tar xf php-7.1.0RC1.tar.bz2
[2016-09-17 追è¨]
ææ°ã®ã³ã¼ãã§æ¹ãã¦å®è¡ãã¾ããã左端㯠PHP 7.1.0 RC1 ã§ä¸å¤®ã¯ååã®çµæ (b5fa120) ã§ããå³ç«¯ãç¾æç¹ã§ã®ææ°ã®ã³ããã (359a790) ã«ãããã®ã§ãã
[2016-10-10 追è¨]
ææ°ã®ã³ã¼ãã§å®è¡ãã¾ããã左端ã¨ä¸å¤®ã¯ãPHP 7.1.0 RC1 ã¨ååã®çµæ (359a790) ãåæ²ãããã®ã§ããå³ç«¯ãç¾æç¹ã§ã®ææ°ã®ã³ããã (75f86fe) ã«ãããã®ã§ãã
[2016-11-19 追è¨]
10 æ 26 æ¥ã«éå¬ãããã第 107 回 PHP 勉強会ã㧠LT çºè¡¨ãã¾ãããJIT ã®éçºãé²ãã«ã¤ãã¦ãã³ããã¼ã¯ã®å®è¡é度ãåä¸ãã¦ããæ§åãã°ã©ãã«ã¾ã¨ãã¾ããã
ãã ããã¡ã¼ãªã³ã°ãªã¹ãã¸ã®æ稿ã«ããã¨ã10/26 æç¹ã®ç¶æ³ã¨ãã¦ã¯ãbench.php ã§ã¯ 3 åã®é度åä¸ããããã®ã®å®ã¢ããªã±ã¼ã·ã§ã³ã§ã¯å¤ãããªãã¨ãã£ãã¨ããã®ããã§ãã
Now, JIT passes almost all PHPT tests, makes 3 times speed-up on bench.php and no significant difference on real-life apps (+/-5% depended on opcache.jit setting.
http://news.php.net/php.internals/96613
*1:Lenovo ThinkPad Edge E130, Core i5-3337U 1.8GHz ã§ãWindows 7 ä¸ã®ä»®æ³æ©æ¢°ã¨ãã¦ã¤ã³ã¹ãã¼ã«ãã CentOS 7 ãå©ç¨ãã¦ãã¾ãã
*2:https://github.com/zendtech/php-src/tree/2fc7a09
*3:https://github.com/zendtech/php-src/tree/b5fa120ããã ãããã®ã³ãããã«å¯¾ãã¦å¾è¿°ã®ä¿®æ£ãå¿ è¦ã§ããã
*4:[2016-09-17 追è¨] æ¢ã«ä¿®æ£ããã¦ãã¾ãã
*5:JIT ãçæããã³ã¼ãã®èª¤ãã®ãããä¿®æ£ããªãã¦ããã«ãã¯æåããå®è¡æã« segmentation fault ã«ãªãã¾ãã
*6:å®æ°ãªãã©ã«ã®ãã¼ãã«ã®ãã¼ã¹ã¢ãã¬ã¹ãã¬ã¸ã¹ã¿ r0 ã«èªã¿è¾¼ãå¦çã®ããã§ããããªãã©ã³ãã®é åºãéã«ãªã£ã¦ãã¾ãã
*7:ãã㯠php-build ã®å®ç¾©ãã¡ã¤ã«ã«æå®ããã¦ãããã®ã§ãã