Laravel Modelクエリー結果の3種類のストレージフォーマットのメモリ使用量比較
3034 ワード
PHP LaravelフレームワークはModelがデータを照会することをサポートした後、多くの方法でデータを返すことができ、初心者にとっていくつかの悩みをもたらすことができます.例えば、配列Modelオブジェクト、集合、純配列は今日メモリの占有角度から3種類のデータの戻り方を比較します.
配列Modelオブジェクト別にデータを返す書き方
集合ごとにデータを返す書き方
純粋な配列でデータを返す書き方
テスト環境
データの比較数量ごとにそれぞれ10、100、1000、10000行のデータを取って と比較する.
書式を返す
クエリの行数
クエリ結果のメモリ使用量
Model配列
10
433.2109K
array
10
457.5313K
Collection
10
433.2891K
Model配列
100
803.3984K
array
100
816.4688K
Collection
100
803.4766K
Model配列
1000
4.3761M
array
1000
4.2790M
Collection
1000
4.3762M
Model配列
10000
40.4700M
array
10000
39.2743M
Collection
10000
40.4701M
結論データ量が100以内の場合、Model配列によるメモリ消費量は よりも少ない. CollectionがModel配列より少し多いのは、Collection集合がオブジェクトパッケージにModel配列を格納しているため、少し鶏の肋骨があるので、私はこの方法で をあまり使いません. Model配列構成IDEアシストプロンプトは開発効率が高く、メモリ占有量が純配列arrayと大きく異なるため、Model配列方式 を推奨する.
開発提案
開発効率とメンテナンスの観点からModel配列の開発方法をお勧めします.PhpStormというIDEでは、Modelのクエリー方法にコメント@return static[]を追加すれば、IDEフィールドの補助があります.もちろん、対応するModelのコメントに属性コメント@propertyを追加することを前提としています.以下にいくつかの例を示します.
Model@propertyの例
使用方法ページリストインタフェースを例にとる
配列Modelオブジェクト別にデータを返す
TestModel::query()->where('field_name', $value)->limit(10)->get()->all();
集合ごとにデータを返す
TestModel::query()->where('field_name', $value)->limit(10)->get();
純粋な配列でデータを返す
TestModel::query()->where('field_name', $value)->limit(10)->get()->toArray();
テスト環境
PHP 7.2.28, Docker Compose, MacOS
データの比較
書式を返す
クエリの行数
クエリ結果のメモリ使用量
Model配列
10
433.2109K
array
10
457.5313K
Collection
10
433.2891K
Model配列
100
803.3984K
array
100
816.4688K
Collection
100
803.4766K
Model配列
1000
4.3761M
array
1000
4.2790M
Collection
1000
4.3762M
Model配列
10000
40.4700M
array
10000
39.2743M
Collection
10000
40.4701M
結論
開発提案
開発効率とメンテナンスの観点からModel配列の開発方法をお勧めします.PhpStormというIDEでは、Modelのクエリー方法にコメント@return static[]を追加すれば、IDEフィールドの補助があります.もちろん、対応するModelのコメントに属性コメント@propertyを追加することを前提としています.以下にいくつかの例を示します.
Model@propertyの例
/**
* @property int $id ID
* @property string $order_sn
*/
class OrderInfoModel extends Model
{
protected $table = 'order_info';
public $timestamps = false;
/**
*/
public static function singleton()
{
return app(static::class);
}
/**
*
* @param string $sn
* @return static
*/
public function findBySn($sn)
{
return static::query()->where('order_sn', $sn)->first();
}
/**
*
* @return static[]
*/
public function findListByPage($page, $pageSize)
{
return static::query()->forPage($page, $pageSize)->get()->all();
}
}
// @return
使用方法
class OrderController extends Controller
{
public function actionList(Request $request)
{
$page = $request->get('page', 1);
$pageSize = $request->get('size', 10);
$results = [];
$list = OrderInfoModel::singleton()->findListByPage($page, $pageSize);
if ($list) foreach ($list as $item) {
$results[] = ['order_sn' => $item->order_sn]; // IDE , $item->order_sn , Model @property
}
//
}
}