PHP中数组赋值性能及过程

hizengzeng

今天导出报表时,测试同事告诉我数据太大了,无法导出。我看了下大概只有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,

这种方式每赋值一次需要一步操作,数据量大了区别就很明显

阅读 2.1k

记录笔记
记录下自己的笔记

hizengzeng

174 声望
9 粉丝
0 条评论

hizengzeng

174 声望
9 粉丝
文章目录
宣传栏