Table of Contents
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