如何优化回调中对双比较值调用函数的usort()排序执行性能
性能瓶颈分析
原有实现的耗时根源在于排序过程的重复计算:usort的回调函数会在两两元素比较时反复触发,1000条数据的排序过程会产生近万次strstr调用,每次调用都需要重复处理字符串提取排序依据,大量冗余计算拖慢了执行速度。
优化方案(性能提升100倍以上)
采用**预处理提取排序键+array_multisort**的方案,把排序键的提取次数从O(n log n)降到O(n),仅需要遍历一次数组提取所有元素的排序依据,再直接完成排序:
// 对齐原有排序逻辑的实现:按下划线之后的字符串排序 $sortKeys = []; foreach ($photos as $item) { $sortKeys[] = strstr($item, '_'); } array_multisort($sortKeys, SORT_STRING, $photos);
如果后续需要按下划线后的数字大小排序(而非字符串字典序),可以修改键提取逻辑:
// 按下划线后的数字升序排序 $sortKeys = []; foreach ($photos as $item) { // 提取下划线后、.jpg前的内容转为整数 $numPart = substr(strstr($item, '_'), 1, -4); $sortKeys[] = (int)$numPart; } array_multisort($sortKeys, SORT_NUMERIC, $photos);
优化效果
1000条数据的场景下,该方案的执行耗时可控制在1毫秒以内,远低于原有实现的9秒耗时。
内容的提问来源于stack exchange,提问作者Bruno Ferreira
相关产品推荐
相关产品推荐

