PHP - array_map比foreach更快吗?

时间:2014-08-25 08:17:34

标签: php performance loops

在性能方面,哪个是更好的选择?

在对象中:

案例#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循环更快?

4 个答案:

答案 0 :(得分:5)

我相信这回答了你的问题,截至2015-01-22

是最新的

Performance of foreach, array_map with lambda and array_map with static function

array_map虽然在PHP中更优雅但速度慢得多。特别是如果使用它与封闭。

答案 1 :(得分:3)

我刚才在Symfony项目上测试了这个,不得不谷歌因为它看起来如此重要。 脚本使用foreach() 160ms 使用array_map() 260ms 。考虑到单个方法调用的应用程序大小相当大的增加。

答案 2 :(得分:3)

用于记录(PHP 7.4 + 64位+ Windows)

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);

答案 3 :(得分:0)

我现在在这里,因为我在谷歌上搜索了以下词:“php 8 foreach 最快”并且请不要威胁他的问题重复 因为我在所有 php 版本中都编写了最快的 php 框架在世界上(经典结构,oop,oop at sum 基于静态公共函数),特别是在 php 7 中,我每次使用的 array_filter 在许多情况下都比 foreach 快,现在我在 xampp 中使用windows 10 x64 使用相同的方法进行基准测试,我在 foreach 上获得了最快的结果。 所以你的问题的答案是肯定的,所以在 php 8 中使用 base,在 php 7 或更低版本中使用其他代码!!!

这是我测试的代码版本(我修改了一个简单的脚本以在屏幕上弹出所有新的引导程序图标 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

我测试的等效代码

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

我用“插件”即兴创作 = 一个 cli php 代码从编辑器内部使用 .exe purebasic 调用它没有插件可能性( 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, '.', '');       
    }

我也是一个公共静态函数“消费者”! 干杯!