php 超大数组循环,php大数组循环嵌套的性能优化

本文记录了一位博主在使用Elasticsearch处理大量数据时遇到的性能瓶颈,主要涉及两个方面:1) 使用isset()替代in_array()提升循环效率;2) 通过优化数组循环结构,将双层循环改为单层循环,显著减少了程序运行时间和内存占用。此外,博主还分享了如何检测和优化内存峰值,强调了代码优化对于程序性能的重要性。
摘要由CSDN通过智能技术生成

一、前言

博主最近在用elasticsearch做项目,查出来的数据都是数组,在筛选数据组装数据的时候,难免会碰到循环嵌套的问题。如果两个50000的数组循环嵌套,那实际运算则是50000*50000的运算量,十分影响程序执行速度。这篇文主要记录博主优化程序的过程。

二、测试程序性能工具

先提供一些测试工具,可以明确知道咱们哪部分程序消耗时间久,占用内存大。

1、测试程序执行时间的函数:

/*

* php输入毫秒部分的代码

* */

function msectime() {

list($msec, $sec) = explode(' ', microtime());

$msectime = (float)sprintf('%.0f', (floatval($msec) + floatval($sec)) * 1000);

return $msectime;

}

借用这段程序检测函数执行速度,输出的是毫秒。关于这个函数,参考我之前的文章:

php获取当前时间的毫秒数,并且利用它测试代码段执行时间

2、php占用内存

echo "当前占用内存: ".memory_get_usage()." 字节 \n";

echo "内存峰值: ".memory_get_peak_usage()." 字节 \n";

这里通过获取当前内存占用的差值来判断程序执行消耗的内存。通过内存的峰值来查看哪部分消耗的内存最多,防止出现内存泄露情况。

三、开始优化

1、部分函数优化

博主在测试的时候,有个函数updateFunnel耗费了4s的时间,这个函数只是个单循环,但是为什么占用这么多内存了,后来百度发现,都是in_array在作怪:

使用 isset()代替 in_array()

原来: in_array($key,$a)

改为: $b = array_flip($a);

isset($b[$key]);

优化后,此时updateFunnel耗时为 2.4s 。

2、数组嵌套循环优化

原函数:

foreach($this->arrEsIndex as $key=>&$val){

foreach($this->arrEsIndex as $k=>$v) {

if ($val['pixel.uuid'] == $v['pixel.uuid']) {

if ($v['pixel.type'] == $this->login_step_val) {

$val[$this->login_step] = 1;

$val['pixel.user_id'] = $v['pixel.user_id'];

}

}

}

}

unset($val);

unset($v);

耗时:7.03-0.7 = 6.33s

优化后:

$newArr = array();

foreach($this->arrEsIndex as $key=>$val){

$newArr[$val['pixel.uuid']] = $val;

}

foreach($this->arrEsIndex as $k=>&$v){

if(isset($newArr[$v['pixel.uuid']])){

if($newArr[$v['pixel.uuid']]['pixel.type'] == $this->login_step_val){

$v[$this->login_step] = 1;

$v['pixel.user_id'] = $newArr[$v['pixel.uuid']]['pixel.user_id'];

}

}

}

unset($newArr);

耗时: 0.751 - 0.748 = 0.03s

我们把两个数组的循环改为了一个数组的循环,同时使用isset()等内置函数来加快对比速度,最终优化效果还可以。不过这也说明了一个问题,咱们在写代码的时候,不能只注重功能的实现,一定要在写完之后测试一下速度。当然,最好是严格遵循一些默认的规则,比如此处的大数组循环,本来就是兵家大忌。

3、内存峰值的优化

我们php程序的内存都会有个限度,在php.ini中由memory_limit定义。一般来说本地的配置都是128M,在绝大部分情况下都是够用的,如果你的程序出现了内存泄露,那代表程序需要优化了,骚年。有些博客会给出方案,增大memory_limit的设置,只可惜治标不治本,推荐先优化程序。

博主在测试程序的时候,发现内存峰值在135M左右,也就是超过了规定的内存,那么问题究竟在哪里呢。经过一步步的打印内存峰值,最终锁定在一个数组变量上,释放掉这个数组变量之后,内存一下子就掉下去了,峰值维持在80M。这部分没法贴代码,大家如果遇到类似的情况,仔细测试下程序即可。

关于php的内存优化,可以参考我的另一篇文章,也许会有帮助哦:

php程序内存优化之数组操作优化

与君共勉!end!

打开App,阅读手记

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值