Laravel Modelクエリー結果の3種類のストレージフォーマットのメモリ使用量比較

3034 ワード

PHP LaravelフレームワークはModelがデータを照会することをサポートした後、多くの方法でデータを返すことができ、初心者にとっていくつかの悩みをもたらすことができます.例えば、配列Modelオブジェクト、集合、純配列は今日メモリの占有角度から3種類のデータの戻り方を比較します.
配列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
    

    データの比較
  • 数量ごとにそれぞれ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の例
    /**
     * @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    
                }
                //      
          }
    }