PHP中陣列賦值效能及過程

hizengzeng發表於2019-02-16

今天匯出報表時,測試同事告訴我資料太大了,無法匯出。我看了下大概只有1500條左右的資料,完全不大。估計是上午將資料寫入陣列時方式不對。修改了下果然ok了。
參考vld用法:http://www.phppan.com/2011/05…
mac下安裝vld擴充套件:http://blog.csdn.net/njys1/ar…
(第一次記錄文章,還不熟悉排版)

下面是簡單的還原
1.效能底下的寫法:

<?php
    $array = null;
    $array[]=`1`;
    $array[]=`a`;
    $array[]=`3`;
?>

使用vld檢視opcode的程式碼:

function name:  (null)
number of ops:  8
compiled vars:  !0 = $array
line     #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
   2     0  E >   ASSIGN                                                   !0, null
   3     1        ASSIGN_DIM                                               !0
         2        OP_DATA                                                  `1`, $2
   4     3        ASSIGN_DIM                                               !0
         4        OP_DATA                                                  `a`, $4
   5     5        ASSIGN_DIM                                               !0
         6        OP_DATA                                                  `3`, $6
   6     7      > RETURN                                                   1

branch: #  0; line:     2-    6; sop:     0; eop:     7; out1:  -2
path #1: 0, 

顯然這種方式每賦值一次需要兩步操作

2.優先的寫法:

<?php
    $array = null;
    $array = [`1`,`a`,`3`];
?>

對應的opcode程式碼:

function name:  (null)
number of ops:  6
compiled vars:  !0 = $array
line     #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
   2     0  E >   ASSIGN                                                   !0, null
   3     1        INIT_ARRAY                                       ~1      `1`
         2        ADD_ARRAY_ELEMENT                                ~1      `a`
         3        ADD_ARRAY_ELEMENT                                ~1      `3`
         4        ASSIGN                                                   !0, ~1
   4     5      > RETURN                                                   1

branch: #  0; line:     2-    4; sop:     0; eop:     5; out1:  -2
path #1: 0,

這種方式每賦值一次需要一步操作,資料量大了區別就很明顯

相關文章