PHP - Is array_map faster than foreach?



就性能而言,哪个选项更好?

在物体中时:

案例#1

public function test( $array ) {
    return array_map( array( $this, 'do_something_to_element' ), $array );
}

案例#2

public function test( $array ) {
    $return = array();
    foreach ( $array as $value ) {
        $return[] = do_something_to_element( $value );
    }
    return $return;
}

当然,还有其他用途,可以填充许多示例。我看到有评论说,在对象中,array_map比foreach循环慢。

通常情况下,array_map/array_walk函数的执行速度是否比有类似需求的foreach循环更快?

对于记录(php 7.4+64位+窗口)

https://github.com/EFTEC/php-benchmarks/blob/master/benchmark_arraymap_foreach.php

  • foreach=0.10213899612427
  • array_map=0.18259811401367
  • array_map(静态)=0.18230390548706
  • array_map(调用函数)=0.17731499671936

Foreach仍然更快,但如果我们使用静态函数或不使用静态函数,也不会有任何区别:

    $result = array_map(function ($number) {
        return $number * 10;
    }, $numbers);
    $result = array_map(static function ($number) {
        return $number * 10;
    }, $numbers);

我刚刚在Symfony项目上测试了这个,因为它看起来很重要,所以不得不用谷歌搜索。脚本从使用foreach()160ms变为使用array_map()260ms

我现在在这里,因为我在谷歌上搜索了以下单词:"php 8 foreach最快";和不要威胁他的问题是重复的,请因为我在所有php版本中都写了世界上最快的php框架(经典的结构、oop、oop-at-sum-based静态公共函数),特别是在php 7中,array_filter i每次使用都比foreach快,现在我在xampwindows10x64中使用相同的方法进行基准测试,并且在foreach上获得了最快的结果。所以你的问题的答案是YES INDED is FOREACH FASST,所以在php 8中使用base that,在php 7或更低版本中使用其他代码!!!

这是代码i测试的版本(我修改了一个简单的脚本,在屏幕上弹出所有新的引导程序图标1.4.1):

我测试的第一段代码,如果你取消注释它的部分和正确的组合部分,你会有一些小的差异,但想法仍然是一样的

 $icons.=<<<icon
    {$pa} {$pa2} 
    icon;
    
    /*
    $icons.=<<<icon
    {$pa}
    icon;
    */
    
    //});
    //},ARRAY_FILTER_USE_KEY);
    },ARRAY_FILTER_USE_BOTH);
    print_r($icons);
    //0.00001200

等效代码i测试

$icons='';
    foreach([0=>1,1=>99] as $ch => $vl){
    $icons.=<<<icon
    {$ch} {$vl} 
    icon;
    }
    print_r($icons);
    //0.00000694

我用一个";插件";即兴创作=在编辑器中使用.exe purebasic调用的cli php代码不具有插件功能(editplus),但具有用户文本过滤器,因此您可以在每个脚本的末尾看到php脚本的结果:

  if ($argv[1]=='bench'){
            $cmd=cmd(1);
            ob_start();
            $start= microtime(true);
            for($i=0;$i<10000;$i++) eval($cmd);
            $stop= microtime(true);
            ob_clean ();
            echo PHP_EOL.'//'. number_format(($stop-$start)/10000, 8, '.', '');       
    }

我是一个公共静态函数";消费者;也是<强烈>欢呼

最新更新