logo header
logo header
logo header
logo header
  • 2014.11.04
  • 技術ブログ開発

Ginqの利便性と性能を天秤にかけて

はじめに

最近、GinqというPHPの面白いライブラリを見付けました。
これはC#のLINQのような操作をPHPで実現するものです。具体的な使い方はPHPメンターズPHPにおける宣言的集合操作入門:Ginqが詳しいのでここでは割愛します。

このライブラリを使ってみて従来のループと比べてどれくらいの性能差があるか疑問に思いました。
確かにソースは簡潔になるのですがC#のように言語に組み込まれていないのでオーバーヘッドがあるはずです。
そこで実際に計測してみました。

Ginqを性能測定

性能測定した環境は以下の通りです。

  • Ubuntu 14.04 LTS "Trusty Tahr"
  • PHP 5.5.9-1ubuntu4.4 (cli) (built: Sep 4 2014 06:56:34)
  • Ginq 0.2

測定対象は上述のPHPにおける宣言的集合操作入門:Ginqから以下の例を拝借して

  • 射影: select その1
  • 射影: select その2
  • 選択: where その1
  • 選択: where その2
  • 集計操作: count

次のようにそれぞれ5回実行した平均値を結果としました。

計測結果

それぞれの計測結果はミリ秒です。

射影: select その1

配列サイズ 1 10 100 1000 10000 100000 1000000
normal 0.0038 0.0060 0.0246 0.2168 2.7536 28.7580 290.5258
normal2 0.0023 0.0050 0.0229 0.2192 3.3441 36.7620 368.9217
ginq 0.1132 0.0336 0.4530 1.6341 18.7360 194.3701 1949.5223
ginq2 0.2779 0.0305 0.2075 1.9310 23.0229 239.2835 2340.3972

射影: select その2

配列サイズ 1 10 100 1000 10000 100000 1000000
normal 0.0040 0.0036 0.0292 0.4484 3.0361 33.1643 350.9957
normal2 0.0034 0.0056 0.0368 0.3936 5.3896 58.1319 596.8952
ginq 0.2816 0.0320 0.2022 2.0889 21.3201 208.2372 2058.5147
ginq2 0.1088 0.0313 0.2292 1.9924 22.2201 229.4112 2328.7640

選択: where その1

配列サイズ 1 10 100 1000 10000 100000 1000000
normal 0.0041 0.0034 0.0234 0.2318 2.4423 29.3150 297.6034
normal2 0.0026 0.0030 0.0191 0.1876 1.9872 24.8407 240.9158
ginq 0.0750 0.0248 0.1436 1.5610 14.4502 144.3290 1484.0577
ginq2 0.0782 0.0227 0.2015 1.5950 15.8692 162.8985 1663.6370

選択: where その2

配列サイズ 1 10 100 1000 10000 100000 1000000
normal 0.0039 0.0038 0.0189 0.2026 2.3337 24.3367 229.5578
ginq 0.0890 0.0372 0.1276 1.2878 15.2535 149.0885 1568.6902
ginq2 0.0808 0.0264 0.1610 1.9630 16.5546 167.7196 1676.5012

集計操作: count

配列サイズ 1 10 100 1000 10000 100000 1000000
normal 0.0016 0.0026 0.0126 0.1333 1.5803 16.1749 160.3049
normal2 0.0018 0.0034 0.0228 0.2251 2.3339 28.6701 258.9342
ginq 0.0524 0.0152 0.0918 0.8409 9.3662 94.3578 997.5321

まとめ

Ginqの速度は最速値と比較すると5〜10倍遅い事が分かりました。
性能を重視するケースでは利用を控えた方がよいと思われます。
そうでない場でも1フローで何度も利用すると目に見えて性能が悪化しますので、データ量とGinqを使用する回数を元にして、簡潔に書ける事と性能のどちらを取るのか検討の余地があると思われます。

ともに世界をアップグレードできる、そんな日を夢見て。
Upgrade the World!