在性能方面,哪个是更好的选择?
在对象中:
案例#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循环更快?
答案 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仍然更快,但是无论我们是否使用静态函数,它都没有任何区别:
$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, '.', '');
}
我也是一个公共静态函数“消费者”! 干杯!