前々からやってみたかったベンチマークをやってみます!
Goはやろうとしても全く手を付けなかった言語なので、本当に最速なのか疑問な言語でした。
そこで本当に速いのか試してみたいと思います。
そしてその相手はPHP!!
最近7.0にバージョンが上がったことで大幅に速くなったとのもっぱらの噂ですが、速いのは一体どちらなのか...!?
##環境とフレームワーク
計測環境と火花を散らすフレームワークの紹介です。
- 計測環境
- Windows 8.1 & XAMP
- PHP
- version 7.0.6
- Go
- version 1.6.2
Go | PHP |
---|---|
Gin | Laravel |
Revel | CakePHP |
Iris |
選定理由は~~思いつきなんですが、~~PHPは業務で使用しているLaravelと有名なCakePHPを、
GoからはGoの中でも軽量らしいGin、そしてフルスタックのRevel、そして最近リリースされてわりと速いらしい(byホームページ)Irisを選定いたしました。
##判定基準
ab -c 100 -n 100 {URL}を使用します。(100人のユーザが同時に1リクエストを送った想定)
判定項目は下の二つです。
- Request Per Second
- 一秒当たりに処理できるリクエスト数
- Failed Request
- ロストしたリクエスト数
##比較するコード
const MAX_OF_RANGE int = 100000;
const N int = 10000;
func main() {
iris.Get("/", func(c *iris.Context) {
var a [N]int
rand.Seed(time.Now().UnixNano())
for i := 0; i < len(a); i++ {
a[i] = rand.Intn(MAX_OF_RANGE)
}
for i := 0; i < len(a); i++ {
for j := len(a) - 1; j > i ; j-- {
if(a[j] < a[j-1]){
var tmp = a[j]
a[j] = a[j-1]
a[j-1] = tmp
}
}
}
})
}
はいそうです。バブルソートです。
0から100000の値をランダムに10000の配列要素へ代入し、
それらをバブルソートします。
このo(N^2)をどれくらいで捌けるのか楽しみです。
##ソースコード
それぞれ"/"へのGETリクエストを受けたときにバブルソートしています。
Go
var a [N]int
rand.Seed(time.Now().UnixNano())
for i := 0; i < len(a); i++ {
a[i] = rand.Intn(MAX_OF_RANGE)
}
//バブルソート
for i := 0; i < len(a); i++ {
for j := len(a) - 1; j > i ; j-- {
if(a[j] < a[j-1]){
var tmp = a[j]
a[j] = a[j-1]
a[j-1] = tmp
}
}
}
PHP
$a = array();
for($i=0; $i<self::N; $i++){
$a[$i] = rand(0, self::MAX_OF_RANGE);
}
for($i=0; $i<self::N -1; $i++){
for($j=self::N -1; $j>$i; $j--){
if($a[$j] < $a[$j-1]){
$tmp = $a[$j];
$a[$j] = $a[$j-1];
$a[$j-1] = $tmp;
}
}
}
##結果
それぞれabコマンドを5回叩いた平均になります。
順位 | フレームワーク | Request per second[#/sec] | Failed Requests |
---|---|---|---|
1位 | Revel | 24.274 | 0 |
2位 | Iris | 26.866 | 0 |
3位 | Gin | 26.924 | 0 |
4位 | Laravel | 0.312 | 0 |
5位 | CakePHP | 0.222 | 0 |
越えられない壁が見えましたね(汗) |
##所感
処理の速さはGoが圧倒的勝利でした。
どちらもFailed Requestが0だというのはとても素晴らしいと思います。←偉そう
でもリリースしたばかりなので今後に期待です。
Goの軽量フレームワークはWebAPIに用いるくらいなら速さ的にも最適なのではないかと思いました。
まさかここまでGoが速いとは思わなかったので、正直驚いています。
フレームワークの選定やベンチマーク方法について、こうしたほうが良いよなどありましたら、教えていただけると嬉しいです。
##おまけ
ちょっとした備忘録を。
- LaravelやCakeなどcomposerを使用するフレームワークの起動するとき発生したエラーはほとんどcomposer installかcomposer updateで解決しました。これについては理由を調査中です。
- 私はGoをGoインストールフォルダの外で作業していましたが、これのせいで何度か泣きそうになったので、デフォルトフォルダ下での作業を推奨します。