PHP大数组过滤元素、修改元素性能分析

转载:https://blog.csdn.net/loophome/article/details/78536270

在PHP开发过程中,数组是非常重要的数据结构,往往有一个操作就是对数组进行过滤,修改,以下是对数组元素进行过滤的几个方法进行分析。

数据源是长度为4592的数组,占用内存8.9MB,方法重复执行5000次。

结论:无论是对数组进行过滤,修改,使用引用的方式是最优的,主要原因在于内存操作次数少。array_filter和array_walk需要调用一次函数,所耗的时间会更长

过滤数组 执行时间 修改数组的值 执行时间

使用复制的形式 18s 使用复制的形式 118s

使用引用 16s 使用引用 12s

使用array_filter 62s 使用array_walk 117s

一、测试过滤数组,过滤条件是过滤元素中sequence字段为奇数的数据。

方式一:使用复制的形式

for ($i = 1; $i <= 5000; $i++) {

$result = formatter1($data);

}

function formatter1($data)

{

$result = [];

foreach ($data as $d) {

if ($d['sequence'] % 2 == 0) {

$result[] = $d;

}

}

return $result;

}

xprof测试结果

函数耗时:18s,formatter1函数中有非常多的内存操作

方式二:删除原数组元素

for ($i = 1; $i <= 5000; $i++) {

formatter2($opt);

}

function formatter2($data)

{

foreach ($data as $k => $v) {

if ($v['sequence'] % 2 == 1) {

unset($data[$k]);

}

}

$data = array_values($data);

}

函数耗时:16s,同时占用内存也是非常低。

方式三:使用array_filter函数+闭包

function formatter3($data)

{

return array_values(array_filter($data, function($val){

return $val['sequence'] % 2 == 0;

}));

}

函数耗时:62s,非常差,而且闭包函数占用了非常多的内存(堆栈调用)。

二、新增和修改元素的内容

这里我们为每个元素新增一个new='add',以及修改原有sequence+=100,通过2种方法进行对比,一个是使用复制的形式,另一个是引用修改的形式。

方式一:使用复制的形式

function modify_method1($data)

{

$result = [];

foreach ($data as $d) {

$d['new'] = 'add';

$d['sequence'] += 100;

$result[] = $d;

}

return $result;

}

从结果看,执行时间为118s,modify_method1函数中有非常多的内存操作,峰值占用内存在13MB。

方式二:使用引用修改的形式

function modify_method2(&$data, $i)

{

foreach ($data as &$d) {

$d['new'] = $i;

$d['sequence'] += 100;

}

}

从结果看,执行时间为12s,modify_method2函数基本上不新增内存操作。

方式三:使用array_walk

function modify_method3($data)

{

array_walk($data, function(&$val){

$val['new'] = 'add';

$val['sequence'] += 100;

});

return $data;

}

耗时,117s,modify_method3函数有非常多的内存操作。

---------------------

作者:loophome

来源:CSDN

原文:https://blog.csdn.net/loophome/article/details/78536270

版权声明:本文为博主原创文章,转载请附上博文链接!