LoginSignup
55
49

More than 5 years have passed since last update.

Goフレームワーク vs PHPフレームワーク

Last updated at Posted at 2016-05-16

前々からやってみたかったベンチマークをやってみます!
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
ロストしたリクエスト数

比較するコード

bubblesort.go
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が速いとは思わなかったので、正直驚いています。

フレームワークの選定やベンチマーク方法について、こうしたほうが良いよなどありましたら、教えていただけると嬉しいです。

おまけ

ちょっとした備忘録を。

  1. LaravelやCakeなどcomposerを使用するフレームワークの起動するとき発生したエラーはほとんどcomposer installかcomposer updateで解決しました。これについては理由を調査中です。
  2. 私はGoをGoインストールフォルダの外で作業していましたが、これのせいで何度か泣きそうになったので、デフォルトフォルダ下での作業を推奨します。
55
49
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
55
49