軽量なPHP FrameworkのFuelPHP1.5.3をできるだけパフォーマンスよく使いたいと試行錯誤中。
ViewにDBからselectした多数の結果(500件)を渡すときのパフォーマンスを調査している。

ORMとDBの性能差

これまでのテストでは、ORMのModel_Item::find() を利用していたが、DB::select を利用するとどうなるだろう。
・output_filter有り
fuelphp_many_list_db_filter_on

随分速い。0.707秒。
・output_filter無し
fuelphp_many_list_db_filter_off

なんと、0.176秒。
この速度は魅力。

ざっとまとめ

どうもModel::find()の時は、SELECT結果を処理する際に、Query::hydrate で処理時間がかかっている模様。
FuelPHP1.5.3でViewに渡すデータが多い場合のパフォーマンスでのフィルタ有無と合わせてまとめてみた。

  filter有り(秒) filter無し(秒)
Model::find(ORM) 7.120 1.540
DB::select 0.707 0.176

fuel_graph

結果として選択肢としては、
・ORMを使う・使わない・高速な一覧が必要な場合のみDB::Selectを使うなど。
・フィルタはOFFにし、Viewに渡すデータを自前で必要最小限サニタイズ・いやいや開発メンバーがヤバイから必ずフィルタされたいのでON
などいろいろあるだろう。
今回は小規模&高速なレスポンスが欲しい&今後の機能追加の予定があまりないので、デフォルトのフィルタはOFF、ORMは使わない方向。
この辺りFuelPHPは柔軟に対応できる&ソース見ればだいたいの仕組みがわかるからFuelPHPにしてよかったように思う。