一、前言
博主最近在用
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']; } } }
试看结束,如继续查看请付费↓↓↓↓
打赏0.5元才能查看本内容,立即打赏
来源【首席数据官】,更多内容/合作请关注「辉声辉语」公众号,送10G营销资料!
版权声明:本文内容来源互联网整理,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 jkhui22@126.com举报,一经查实,本站将立刻删除。