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

  • 相关阅读:
    指针
    《算法图解》3
    《算法图解》2
    Python缩进
    linux_01_seq_shuf_sort
    centos yum 切换阿里源
    Python csv 跳过第一行 去除表头 读取文件内容
    C语言结构体内存分析
    shell csv导入mysql ERROR 1292 (22007) at line 1: Incorrect datetime value: '' for column 解决方案
    代码实现:数据结构之数组当中唯一的k个数 k=1,2
  • 原文地址:https://www.cnblogs.com/firstForEver/p/7263348.html
Copyright © 2011-2022 走看看