zoukankan      html  css  js  c++  java
  • PHP性能优化:in_array和isset 在大数组查询中耗时相差巨大,以及巧妙使用array_flip

      今天在PHP业务开发中,发现了一个问题。

      两个较大数组(20万+元素),遍历其中一个$a,另一个数组$b用于查找元素。

      比如

    foreach($a as $val){
        if(in_array($xx, $b)){
            //
        }
    }

      发现速度非常之慢,加上业务处理,耗时快半个小时之久。

      排查之后发现in_array()的速度很慢。

      怎么样优化呢?在php数组中,如果用in_array 或者 array_search 这种寻找数组value值的,php会整个遍历一遍查询,这样当数组很大时,当然会很慢。

      而考虑使用array_key_exists 或者 语言构造器isset 则会很快。

      但是这两个用法需要value是key才行,非常幸运,php是世界上最好的语言。。array_flip()提供了这个用法。

      所以: 

    $c = array_flip($b);
    foreach($a as $val){
        if(isset($c[$xx])){
            //
        }
    }

      速度瞬间起来了~

      来一段测试代码:

    <?php
    
    set_time_limit(0);
    
    $arr = range(1, 100000);
    $arr1 = array_flip($arr);
    
    $len = count($arr);
    
    $j = 5000;
    
    // array_key_exists
    $begin = time();
    for($i = 0; $i < $len; $i++){
        if(array_key_exists($j, $arr1)){
        }
    }
    echo "array_key_exists:".(time() - $begin)."
    ";
    
    
    // isset
    $begin = time();
    for($i = 0; $i < $len; $i++){
        if(isset($arr1[$j])){
        }
    }
    echo "isset:".(time() - $begin)."
    ";
    
    
    // in_array
    $begin = time();
    for($i = 0; $i < $len; $i++){
        if(in_array($j, $arr)){
        }
    }
    echo "in_array:".(time() - $begin)."
    ";
    
    
    /**
     *
        array_key_exists:0
        isset:0
        in_array:17
     */

    再贴个真实业务上对比:

    一个4s,一个1746s

  • 相关阅读:
    Json的序列化与反序列化
    RelativeSource设定绑定方向
    Java导出Excel工具类
    CentOS配置ssh免密码登录
    CentOS为用户增加root权限
    CentOS安装RabbitMQ步骤
    CentOS配置主机名和主机映射
    CentOS配置静态IP
    Java执行系统命令工具类(JDK自带功能)
    Linux定时任务
  • 原文地址:https://www.cnblogs.com/firstForEver/p/7263348.html
Copyright © 2011-2022 走看看