PHP:什么更快?array_merge或数组联合运算符 (+)


PHP:What is faster? array_merge or array union operator (+)?

我有两个带有唯一数字键的数组。如何更快地合并它们?

PHP 7.1.5 上的 10000000 次迭代,有两个小的多维数组:

  • 加号运算符 (+):1.966 秒
  • array_merge:9.431 秒

所以加号运算符更快,但如果发生碰撞,结果会有所不同。

最重要的是代码的易读性。这种微优化通常是一个错误,因为您应该编写最干净的代码,然后通过分析来优化它。

如果你想加快速度或分析所花费的时间,我建议使用 xdebug,以及像 cachegrind 这样的东西来查看输出。

我发现以下测试的结果尚无定论:

$n = 1_000_000;
echo 'Changed value is not overwritten:' . PHP_EOL;
$a = [
    'static' => 0,
];
$start = microtime(true);
for ($i = 0; $i < $n; $i++) {
    $a = $a + [
        'dynamic' => $i,
    ];
}
$end = microtime(true);
$first = $end - $start;
echo 'union: ' . ($first) . PHP_EOL;
$b = [
    'static' => 0,
];
$start = microtime(true);
for ($i = 0; $i < $n; $i++) {
    $b = array_merge([
        'dynamic' => $i,
    ], $b);
}
$end = microtime(true);
$second = $end - $start;
echo 'merge: ' . ($second) . PHP_EOL;
print_results($first, $second);
echo 'Changed value is overwritten:' . PHP_EOL;
$c = [
    'static' => 0,
];
$start = microtime(true);
for ($i = 0; $i < $n; $i++) {
    $c = [
        'dynamic' => $i,
    ] + $c;
}
$end = microtime(true);
$first = $end - $start;
echo 'union: ' . ($first) . PHP_EOL;
$d = [
    'static' => 0,
];
$start = microtime(true);
for ($i = 0; $i < $n; $i++) {
    $d = array_merge($d, [
        'dynamic' => $i,
    ]);
}
$end = microtime(true);
$second = $end - $start;
echo 'merge: ' . ($second) . PHP_EOL;
print_results($first, $second);
function print_results($first, $second):void {
    if ($first < $second) {
        $percent = number_format(100 * ($second / $first - 1), 2) . '%';
        echo '+ is ' . $percent . ' faster than array_merge' . PHP_EOL . PHP_EOL;
        return;
    }
    $percent = number_format(100 * ($first / $second - 1), 2) . '%';
    echo 'array_merge is ' . $percent . ' faster than +' . PHP_EOL . PHP_EOL;
}

结果 1(最常见,但不是决定性的):

Changed value is not overwritten:
union: 0.10432696342468
merge: 0.11506199836731
+ is 10.29% faster than array_merge
Changed value is overwritten:
union: 0.11133003234863
merge: 0.11170411109924
+ is 0.34% faster than array_merge

结果 2(经常):

Changed value is not overwritten:
union: 0.11403703689575
merge: 0.1212010383606
+ is 6.28% faster than array_merge
Changed value is overwritten:
union: 0.11069583892822
merge: 0.10777497291565
array_merge is 2.71% faster than +

结果 3(罕见):

Changed value is not overwritten:
union: 0.12785387039185
merge: 0.11510610580444
array_merge is 11.07% faster than +
Changed value is overwritten:
union: 0.10895609855652
merge: 0.10755109786987
array_merge is 1.31% faster than +

唏嘘

使用

整个代码库中使用的任何一种,或者将它们全部重构为您认为更具可读性的那个。对我来说,这就是数组联合运算符(+)。请注意,两者仅对关联数组产生相同的结果(假设您正确更改了操作数的顺序)。