Top View


Author shiro seike / せいけ しろう / 清家 史郎

PHP8のJITを有効にして、PHP7と速度比較する

2020/11/28

configure

README はこちら

あまり検証結果ブレさせたくないので、可能な限りconfigureオプションは何も設定せずMakeしていきます。

$ ./configure

 省略

configure: error: Please specify the install prefix of iconv with --with-iconv=<DIR>

とりあえずiconvは求められたので指定します。

$ brew --prefix libiconv
/usr/local/opt/libiconv

$ ./configure --with-iconv=/usr/local/opt/libiconv

 省略

+--------------------------------------------------------------------+
| License:                                                           |
| This software is subject to the PHP License, available in this     |
| distribution in the file LICENSE. By continuing this installation  |
| process, you are bound by the terms of this license agreement.     |
| If you do not agree with the terms of this license, you must abort |
| the installation process at this point.                            |
+--------------------------------------------------------------------+

Thank you for using PHP.

Thank you for making PHP8.

Make

READMEにも乗っていますが、ビルドを高速化する為に、
-jを使って最大ジョブ数を仮想コア数である12を指定します。


$ make -j12

 省略

Build complete.
Don't forget to run 'make test'.

一応 make test します
(検証なのでFailあってもInstallしちゃいますが

$ make test

 省略

=====================================================================
TEST RESULT SUMMARY
---------------------------------------------------------------------
Exts skipped    :   46
Exts tested     :   26
---------------------------------------------------------------------

Number of tests : 16018             10892
Tests skipped   : 5126 ( 32.0%) --------
Tests warned    :    1 (  0.0%) (  0.0%)
Tests failed    :    1 (  0.0%) (  0.0%)
Expected fail   :   30 (  0.2%) (  0.3%)
Tests passed    : 10860 ( 67.8%) ( 99.7%)
---------------------------------------------------------------------
Time taken      :  368 seconds
=====================================================================

=====================================================================
FAILED TEST SUMMARY
---------------------------------------------------------------------
php://fd wrapper: invalid file descriptor [ext/standard/tests/file/php_fd_wrapper_04.phpt]
=====================================================================

1件だし強い心で次に進みます。

make installは mkdirなどでコケちゃうのでsudo していきます

$ sudo make install

Installing shared extensions:     /usr/local/lib/php/extensions/no-debug-non-zts-20200930/
Installing PHP CLI binary:        /usr/local/bin/
Installing PHP CLI man page:      /usr/local/php/man/man1/
Installing phpdbg binary:         /usr/local/bin/
Installing phpdbg man page:       /usr/local/php/man/man1/
Installing PHP CGI binary:        /usr/local/bin/
Installing PHP CGI man page:      /usr/local/php/man/man1/
Installing build environment:     /usr/local/lib/php/build/
Installing header files:          /usr/local/include/php/
Installing helper programs:       /usr/local/bin/
  program: phpize
  program: php-config
Installing man pages:             /usr/local/php/man/man1/
  page: phpize.1
  page: php-config.1
/Users/seike460/src/php-8.0.0/build/shtool install -c ext/phar/phar.phar /usr/local/bin/phar.phar
ln -s -f phar.phar /usr/local/bin/phar
Installing PDO headers:           /usr/local/include/php/ext/pdo/

$ php -v
PHP 8.0.0 (cli) (built: Nov 28 2020 08:15:08) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.0-dev, Copyright (c) Zend Technologies
    with Zend OPcache v8.0.0, Copyright (c), by Zend Technologies

検証コードと比較バージョン

Walk-through: benchmarking PHP vs KPHP vs C++ より
PHP code: quicksort algorithm をお借りして速度検証します

macに残ってたPHP7.3.22を利用してみます。 わかりやすくするために、シンボリックリンクも構築します。

$ which -a php

/usr/local/bin/php
/usr/bin/php
■PHP7
$ /usr/bin/php -v

legacy software. Future versions of macOS will not include PHP.
PHP 7.3.22-(to be removed in future macOS) (cli) (built: Oct 30 2020 00:19:11) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.22, Copyright (c) 1998-2018 Zend Technologies

$ ln -s /usr/bin/php /usr/local/bin/php7
■PHP8
$ /usr/local/bin/php -v
PHP 8.0.0 (cli) (built: Nov 28 2020 08:15:08) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.0-dev, Copyright (c) Zend Technologies
    with Zend OPcache v8.0.0, Copyright (c), by Zend Technologies

$ ln -s /usr/local/bin/php /usr/local/bin/php8

Pureな速度

純粋な速度を計測したいのでiniファイルは意図的に外していきます。

ini

■PHP7
$ php7 -i | grep ini
Configuration File (php.ini) Path => /etc
Scan this dir for additional .ini files => (none)
Additional .ini files parsed => (none)

■PHP8
$ php8 -i | grep ini
Configuration File (php.ini) Path => /usr/local/lib
Scan this dir for additional .ini files => (none)
Additional .ini files parsed => (none)

quicksort

$ php7 quicksort.php
Sorted 1000000 elements in 1751.161ms

$php8 quicksort.php
Sorted 1000000 elements in 1556.129ms

ちょっと早くなってるって感じですね

opcache

opcache.enable-cliを有効にしてみます。

php.ini

zend_extension=opcache

[opcache]
opcache.enable_cli=1
$ php7 -i | grep opcache.enable_cli
opcache.enable_cli => On => On

$ php8 -i | grep opcache.enable_cli
opcache.enable_cli => On => On

quicksort opcache

$ php7 quicksort.php
Sorted 1000000 elements in 1498.689ms

$ php8 quicksort.php
Sorted 1000000 elements in 1309.025ms

opcacheを有効にすると、やはり早くなりますね

JIT

さあいよいよJITを有効にしてみます。
opcache.jit と共に opcache.jit-buffer-sizeも設定しないとJITが有効にならないので設定していきます。

php.ini

zend_extension=opcache

[opcache]
opcache.enable_cli=1

opcache.jit=on
opcache.jit_buffer_size=100M

php7にこれを読み込ませても問題なさそうなので、どちらでも再度速度検証します。

quicksort

$ php7 quicksort.php
Sorted 1000000 elements in 1553.675ms
$ php8 quicksort.php
Sorted 1000000 elements in 435.416ms

3倍速強です。 まるで赤い彗星 ですね。

opcache.jit=function

opcache.jitの設定にて関数単位でJITを行う設定があったのでこちらも試してみました。

function: 関数単位でJITを使う。

php.ini

zend_extension=opcache

[opcache]
opcache.enable_cli=1

opcache.jit=function
opcache.jit_buffer_size=100M

quicksort

$ php8 quicksort.php
Sorted 1000000 elements in 527.271ms

関数単位にしてしまうとやはり遅くなってしまうようですね。

まとめ

思いの外、速度の向上が見られて興奮しました。
早く実戦投入してみたくなって来ましたね!

さらに速度検証した結果をPHP Conference Japan 2020 Re:bornにて発表させていただきます!
お時間ありましたらぜひご参加ください!

該当セッション:PHP8はISUCONへの扉を開く鍵となるか

参加リンク:PHPカンファレンス 2020

shiro seike / せいけ しろう / 清家 史郎

shiro seike / せいけ しろう / 清家 史郎

Twitter X

Company:Fusic CO., LTD. Slides:slide.seike460.com blog:blog.seike460.com Program Language:PHP , Go Interest:Full Serverless Architecture

Related Posts

PHP8のプロファイリングにXdebug3とWebgrindを使う
shiro seike / せいけ しろう / 清家 史郎

shiro seike / せいけ しろう / 清家 史郎

2020/12/14



ISUCON10予選にPHPで挑戦しました
shiro seike / せいけ しろう / 清家 史郎

shiro seike / せいけ しろう / 清家 史郎

2020/09/20


sebastianbergmann/phpcpdでコピペコードを撲滅する
shiro seike / せいけ しろう / 清家 史郎

shiro seike / せいけ しろう / 清家 史郎

2019/12/23


AWS Lambda With RDS Proxy Performance
shiro seike / せいけ しろう / 清家 史郎

shiro seike / せいけ しろう / 清家 史郎

2019/12/11