用in_array查十万条数据脚本跑三分钟,换关联数组哈希查找,三秒跑完快六十倍
新手写PHP,处理数据的时候,用in_array在几万条数据的大数组里反复查,脚本跑一次几十秒,其实数组操作用对方法,性能能差几十倍。我之前写个数据统计脚本,在十万条数据的数组里循环查匹配,脚本跑了三分钟,后来换了成关联数组当索引,三秒就跑完了。
最常见的性能坑,就是用in_array查大数组,in_array是从头遍历数组找值,数据量小的时候没事,数据上十万条,每次查都遍历一遍,循环次数直接指数级涨。正确的做法是,把数组的键当索引,比如要查用户ID是不是存在,把用户ID当数组的键,查的时候直接isset($arr[$uid]),这是哈希查找,不管数组多大,一次就找到,比in_array快几十倍。
还有个坑,就是循环里反复array_merge,把两个数组合并成一个,每次循环都合并,时间复杂度越来越高。正确的做法是,把要追加的内容先放到一个临时数组里,循环完一次性合并,别在循环里反复合并。我之前写脚本,循环里merge两个数组,一万次循环跑了十秒,改成最后一次性merge,0.2秒就跑完了。
另外,PHP里别在循环里做数组排序,排序是很耗性能的操作,循环一万次排一次序,脚本直接卡死。正确的做法是,循环把数据收集完,最后一次性排序。很多新手写代码的时候,怎么方便怎么来,在循环里各种数组操作,小数据量看不出问题,数据一上来脚本就慢得没法用。
我现在处理PHP数组,第一反应是这个操作能不能用键当索引,能不能把重复操作放到循环外面,写完跑个小测试,看十万条数据要跑多久,别等上线了,用户数据多了,脚本卡得跑不动才优化。很多新手觉得PHP数组操作没什么要注意的,等处理大数据量的时候,才发现之前写的代码慢得离谱,重写比一开始就注意性能花的时间多十倍。
本站源码来源于网络收集修改或者交换,甚至可能并非原创,如遇未经考证信息需持审慎态度。若有疑问,可联系本站处理。