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

  • 相关阅读:
    日历生成器 v1.0 PHP
    原理
    Math.Round默认采用的不是四舍五入法, 而是四舍六入的银行家算法, 如何找回四舍五入法?
    .Net Attribute特性
    转: 如何删除windows service (How to delete a windows service)
    PowerShell入门
    Session, Cookie, Web.config中的cookieless总结
    Assembly.CreateInstance()与Activator.CreateInstance()方法 (转)
    Telnet与远程桌面
    Setting Meta Tags
  • 原文地址:https://www.cnblogs.com/firstForEver/p/7263348.html
Copyright © 2011-2022 走看看