Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
PHP7.1 is fast(?)
Search
uzulla
January 01, 2017
Programming
1
1.6k
PHP7.1 is fast(?)
2017/?/? (forgot)
at somewhere.
this is kind of (joke|comedy).
uzulla
January 01, 2017
Tweet
Share
More Decks by uzulla
See All by uzulla
バイブスあるコーディングで ~PHP~ 便利ツールをつくるプラクティス
uzulla
1
310
PHPer's Guide to Daemon Crafting Taming and Summoning
uzulla
2
1.5k
似たもの同士のPerlとPHP
uzulla
1
230
More Context, Better Code. 既存コードやOAS等をコンテキストとしてLLMに与える事で、よりよいコード生成を行う話
uzulla
1
160
あなたのアプリ、ログはでてますか?あるいはログをだしてますか? (Funabashi.dev用 軽量版)
uzulla
3
260
セッションのトークセッション / Traps for PHP session features in growing web apps
uzulla
2
180
Crafting a Own PHP - ウキウキ手作りミニマリストPHP
uzulla
5
2.5k
例外を投げるのをやめてみないか? あるいは受け入れてみないか? - How to use exceptions other than throwing
uzulla
5
1.2k
PHPerが ISUCONでやるべき事
uzulla
1
1.3k
Other Decks in Programming
See All in Programming
階層化自動テストで開発に機動力を
ickx
1
450
AIに安心して任せるためにTypeScriptで一意な型を作ろう
arfes0e2b3c
0
310
GPUを計算資源として使おう!
primenumber
1
310
Gemini CLIの"強み"を知る! Gemini CLIとClaude Codeを比較してみた!
kotahisafuru
3
820
Flutterと Vibe Coding で個人開発!
hyshu
1
180
ソフトウェア設計とAI技術の活用
masuda220
PRO
25
7.1k
iOS開発スターターキットの作り方
akidon0000
0
230
フロントエンドのパフォーマンスチューニング
koukimiura
6
2.3k
Vibe coding コードレビュー
kinopeee
0
380
中級グラフィックス入門~効率的なメッシュレット描画~
projectasura
4
2.2k
CLI ツールを Go ライブラリ として再実装する理由 / Why reimplement a CLI tool as a Go library
ktr_0731
3
900
AWS Summit Japan 2024と2025の比較/はじめてのKiro、今あなたは岐路に立つ
satoshi256kbyte
1
260
Featured
See All Featured
Designing for humans not robots
tammielis
253
25k
Raft: Consensus for Rubyists
vanstee
140
7k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
34
5.9k
Code Review Best Practice
trishagee
69
19k
Build The Right Thing And Hit Your Dates
maggiecrowley
37
2.8k
GraphQLとの向き合い方2022年版
quramy
49
14k
Producing Creativity
orderedlist
PRO
346
40k
Rails Girls Zürich Keynote
gr2m
95
14k
Optimizing for Happiness
mojombo
379
70k
Unsuck your backbone
ammeep
671
58k
Optimising Largest Contentful Paint
csswizardry
37
3.4k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.4k
Transcript
PHP7.1 is fast(?)
name: ͍ͩ͠͡ΎΜ͍ͪ (Ishida) nick: uzulla (͏ͣΒ) fun: PHP and !
conclusion 7.1 is fast ! (but any evidence here)
need benchmark !!
by the way... php can't to be standalone httpd. right?
(php -s is for only development use) (btw, hhvm can be !) If will benchmark with apache/nginx, that is unfair(???)
use "ReactPHP"! (use libevent) standalone httpd(and other), that written by
PHP!
Test Enviroment 4 VPS (Vultr, $5/mo) 4 1Core 4 1GB
mem 4 ubuntu 16.10 4 PHP7.1.2
Write git clone code. 4 httpd, written by php 4
https://github.com/uzulla/ ReactPHP_PostSupportSample 4 include monolog, twig(template engine.)
<?php require_once 'vendor/autoload.php'; $loader = new Twig_Loader_Filesystem(__DIR__.'/templates'); $twig = new
Twig_Environment($loader, [ 'cache' => __DIR__.'/twig_cache', ]); $access_log = new \Monolog\Logger('access'); $access_log->pushHandler(new \Monolog\Handler\StreamHandler(__DIR__.'/access.log', \Monolog\Logger::INFO)); // app $app = function (\Uzulla\React\Http\Request $req,\React\Http\Response $res) use ($twig, $access_log) { $path = $req->getPath(); $method = $req->getMethod(); $access_log->addInfo("{$method}\t{$path}"); $params = [ 'params'=>$req->getParams(), 'query'=>$req->getQuery() ]; if($method === 'GET' && preg_match('|\A/\z|u', $path)){ $res->writeHead(200, ['Content-Type' => 'text/html']); $res->end($twig->render('index.twig',$params)); }elseif($method === 'POST' && preg_match('|\A/\z|u', $path)){ $res->writeHead(200, ['Content-Type' => 'text/html']); $res->end($twig->render('index.twig',$params)); }else{ $res->writeHead(404, ['Content-Type' => 'text/html']); $res->end($twig->render('notfound.twig')); } }; // build reactor $loop = React\EventLoop\Factory::create(); $socket = new React\Socket\Server($loop); $http = new \Uzulla\React\Http\Server($socket); $http->on('request', $app); $socket->listen(8080); echo "running...\n"; $loop->run();
$ git clone THAT $ composer install $ php boot.php
listen...
ab(apache bench) 4 ab -n 10000 -c 10 http://127.0.0.1:8080/
Requests per second: 3477.39 #/sec
okay, try more concurrent connection.
5000 concurrent 4 ab -n 10000 -c 5000 http://127.0.0.1:8080/
fail 4 socket: Too many open files (24)
ok, ab's limits. try another tool. apt install wrk 4
https://github.com/wg/wrk
wrk 4 wrk -c 5000 -d 5 http://127.0.0.1:8080/
Requests/sec 98.16
tooooo slow, hmmm, concurrent overkill? try 1000 concurrent (same as
ab's test).
4 wrk -c 1000 -d 5 http://127.0.0.1:8080/ 4 Requests/sec: 83.17
!
okey, wrk is dosen't work. try with httperf ! 4
https://github.com/httperf/httperf
httperf 4 httperf --port=8080 --server=127.0.0.1 -- rate=2800 --num-conns=10000 --hog
Request rate: 2799.6 req/s
seems good. but, is this correct? I need try more
tools !
siege 4 siege -c 100 http://127.0.0.1:8080/ 4 Transaction rate: 393.35
trans/sec
Untrustworthy... (Of course, these bench mark tools are more trustworthy
than weird httpd.)
all results (?) ab: 3477.3 #/sec wrk: 98.1 req/sec httperf:
2799.6 req/s siege: 393.3 trans/sec
me: I'm screwed lestrrat ( a.k.a daisuke maki): Why don't
you write a bechmarker yourself ? me: what?
me: OK, I'll write tools! (at YESTERDAY 11:36 pm)
I wrote "benchmark.php" !! (ta daaa!)
<?php $c = 10000 ; $target = "http://127.0.0.1:8080" ; $start_usec
= microtime(true); for( $i=0; $c>$i; $i++ ){ $res = file_get_contents($target); } $used_time = (microtime(true) - $start_usec) ; echo ceil( 1/( $used_time/$c ) ); echo "req/sec";
haha... yes, just kidding. let's play.
(unreliable) result 4 3,731 req/sec
I can't believe this result. (faster than ab ;lol) it's
not bad. but ...
I thought, this is slow benchmark tool. ! I want
more faster". but how? I need concurrent.! but, this is php. (curl_multi ? yes...but... ) OK! WE NEED FORK! !
<?php $max_worker = 10; $c = 10000; $c_ = $c/$max_worker;
$target="http://127.0.0.1:8080"; $start_usec = microtime(true); $pids=[]; for($x=0;$max_worker>$x;$x++){ $pid = pcntl_fork(); if ($pid == -1) { die("fork failed");} else if ($pid) { $pids[]=$pid; } else { for($i=0;$c_>$i;$i++){ $res = file_get_contents($target); } exit; } } foreach($pids as $pid){ pcntl_waitpid($pid, $status); } $used_time = (microtime(true) - $start_usec) ; echo ceil( 1/( $used_time/$c ) ), "req/sec";
2881req/sec (no fork ver 3,731 req/sec)
no no, more slow !!! !
! need more core!!!
create 4core 8GB mem server !
benchmark.php 4147req/sec fork_benchmark.php 3995req/sec
NO! why fork ver is more slow!? !
my httpd is BAD, that is why!!! ! I use
nginx to benchmark my benchmark!! !
result(?) with nginx 4 benchmark.php 4 6817req/sec 4 fork_benchmark.php 4
13730req/sec
OK! 4 fork ver faster than not fork ver!!
( what is ok? )
meanwhile in apache bench... 4 ab -c 10 -n 10000
http://nginx/ 4 Requests per second: 15273.21
compare own tool and ab. 4 fork_benchmark.php: 4 13,730 req/sec
4 ab: 4 15,273.21 #/sec
okey!(?)
conclusion my bench (written by PHP) 0.9 times faster than
AB !! ( DISCLAIMER, THIS RESULT IS REAL RESULT. BUT JUST PLAYING.)
OK !!
"what is ok?" (now 2:12 am)
Other benchmarks. 4 php7.1.2 with my_httpd + fork_bench.php(c:10) 4 3858req/sec
4 php5.6.30 with my_httpd + fork_bench.php(c:10) 4 2425req/sec 4 hhvm3.18.1 with my_httpd + fork_bench.php(c:10) 4 2377req/sec 4 (but, hhvm w/o libevent)
conclusion PHP7.1 is fast (1.6x faster than 5.6 (at this
test))
(REAL) conclusion USE RELIABLE TOOLS USE NGINX DON'T USE PHP
FOR WRITE A BENCHMARK TOOL
but fun. PHP is waiting New Challengers ..... FIN
//NEXT use pthread;