CakePHP(v3.x)のcollection classでbufferedの使い所

例えばSalesというモデルがpriceとtaxというカラムを持っていて、Collectionクラスを用いて複数個のSaleの消費税と価格の合算値を出したいとします。 ここではcollectionクラスのsumOfを使うと便利ですが、

合計を出す時、

$price = collection($sales)->sumOf("price");
$tax = collection($sales)->sumOf("tax");
$total = $price + $tax;

と計算するとcollectionクラスを2回コンストラクトしてしまうため、少し勿体無いです。

ここでbufferedメソッドを使うと以下のようにかけます。

$sales = collection($sales)->buffered();
$price = $sales->sumOf("price");
$tax = $sales->sumOf("tax");
$total = $price + $tax;

両者の実行時間を441個のエンティティにおいて実行した際の実行時間は以下の通りです。

>>> NoBuffered :0.011492967605591 秒

>>> Buffered :0.0094149112701416 秒

少し早いですね。Collectionクラスを使い回す時はbufferedを用いた方が良さそうです。