实现功能:数组值做 +1 操作(测试案例中数组长度为1000w)
php版本:5.6.32
处理方式有:
- foreach 加引用做循环+1
- for 循环+1
- foreach 普通循环+1
- array_walk +1
- array_map +1
代码:
<?php
ini_set('memory_limit', '2048M');
$j = 10000000;
// foreach with &
$arr = [];
for ($i = 1; $i <= $j; $i++) {
$arr[] = $i;
}
$t1 = microtime(true);
foreach ($arr as &$value) {
$value += 1;
}
$t2 = microtime(true);
$t = $t2 - $t1;
echo "foreach with &: {$t}\n";
// for
$arr = [];
for ($i = 1; $i <= $j; $i++) {
$arr[] = $i;
}
$t1 = microtime(true);
for ($i = 0; $i < $j; $i++) {
$arr[$i] += 1;
}
$t2 = microtime(true);
$t = $t2 - $t1;
echo "for: {$t}\n";
// foreach
$arr = [];
for ($i = 1; $i <= $j; $i++) {
$arr[] = $i;
}
$t1 = microtime(true);
foreach ($arr as $key => $value) {
$arr[$key] = $value + 1;
}
$t2 = microtime(true);
$t = $t2 - $t1;
echo "foreach: {$t}\n";
// array_walk
$arr = [];
for ($i = 1; $i <= $j; $i++) {
$arr[] = $i;
}
$t1 = microtime(true);
$arr = array_walk($arr, function (&$v) {
$v += 1;
});
$t2 = microtime(true);
$t = $t2 - $t1;
echo "array_walk: {$t}\n";
// array_map
$arr = [];
for ($i = 1; $i <= $j; $i++) {
$arr[] = $i;
}
$t1 = microtime(true);
$arr = array_map(function ($v) {
$v += 1;
return $v;
}, $arr);
$t2 = microtime(true);
$t = $t2 - $t1;
echo "array_map: {$t}\n";
测试结果:
总结:
数组循环方式性能排序:
带引用的foreach > for > 普通foreach > array_walk > array_map,
经改变数组长度得知性能差别随数组长度的增大而增大。