HHVMで性能テストもどきしてみた
HHVMをせっかくインストールしてみたので、今回は本当にHHVMは通常のPHPよりも速いのかの性能テストをしてみました。
環境
MacAirにVagrantで以下の環境を構築して比較を行ってみる。
- ubuntu14.04 + nginx + HHVM(Hackコード)
- ubuntu14.04 + apache2 + php5.5
(より本番環境を想定するとローカルサーバーは良くないのでは(・・?))
ソースコードはあんまりいいものが思いつかずFizzBuzz問題を使用することにした。
ループ回数を100, 10000, 1000000回で実施した。
<?php for($i = 1; $i < 1000000; $i++){ if($i % 15 == 0){ print("FizzBuzz\n"); }else if( $i % 3 == 0){ print("Fizz\n"); }else if( $i % 5 == 0){ print("Buzz\n"); }else{ print($i."\n"); } }
Hackのコードは冒頭の<?php
の部分を<?hh
に変更するだけでよい。
Apache Bench
ab - Apache HTTP server benchmarking tool - Apache HTTP Server Version 2.4
Apacheをインストールするとデフォルトでくっついてくる
サクッとお手軽に負荷テストができるApache Benchというものがあるので今回はこれを使う。
AB(Apache Bench)の使い方
ab -n リクエストの総数 -c クライアント数(ユーザー数)
ab -n 100 -c 100 http://192.168.33.10/hello.php
結果の見方
結果はこんな感じで返ってくる。それぞれの意味合いは以下のようになる。
結果 | 説明 |
---|---|
Concurrency Level | クライアントの数、-cの後の値が返ってくるはず |
Time taken for tests | 接続時間 |
Complete requests | 成功したリクエストの数 |
Failed requests | 失敗したリクエストの数 |
Requests per second | 1秒当たりに処理できるリクエスト数 |
Time per request(mean, across all concurrent requests) | 1リクエスト当たりの処理時間 |
Concurrency Levelを徐々に増やしていき、Failed requestsが発生した時点がそのサーバーの処理限界ということになる。
測定結果
HHVMと通常のPHP環境それぞれにFizzBuzzのループ回数を増やしていき、以下のコマンドを5回づつ実施した。
ab -n 250 -c 250 http://192.168.33.10/fizzbuzz.php
それぞれのRequests per secondの結果を以下に示す。
100ループ
HHVM + nginx | PHP + apache2 | |
---|---|---|
1回目 | 507.72 | 548.80 |
2回目 | 506.23 | 543.82 |
3回目 | 509.12 | 542.11 |
4回目 | 505.88 | 546.89 |
5回目 | 507.35 | 544.71 |
平均値 | 507.26 | 545.27 |
同じくらいかどちらかというと通常のPHPの方が処理速度が速いことが分かる。
1万ループ
HHVM + nginx | PHP + apache2 | |
---|---|---|
1回目 | 564.48 | 230.76 |
2回目 | 565.06 | 232.59 |
3回目 | 564.84 | 228.59 |
4回目 | 562.77 | 231.54 |
5回目 | 558.20 | 236.23 |
平均値 | 563.07 | 231.94 |
通常のPHPがループ回数を100倍したことにより処理速度が1/2以上落ち込んでいる。一方で、HHVMの方は100ループの時よりも100000ループの方が処理速度が変わらないどころかちょっと速いという謎の結果になった。
100万ループ
HHVM + nginx | PHP + apache2 | |
---|---|---|
1回目 | 572.52 | 2.62 |
2回目 | 558.95 | 2.64 |
3回目 | 570.53 | 2.65 |
4回目 | 567.62 | 2.67 |
5回目 | 559.75 | 2.83 |
平均値 | 565.87 | 2.68 |
ここまでループ回数を増やすとHHVMの方が圧倒的に速い。200倍以上速いことになっている。それとHHVMの特徴として目につくのはループ回数を増やしても性能がほとんど変化していないということである。