PHP:array_merge和数组联合操作符(+)哪个更快?

3

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


4
请注意,array_merge函数和数组+运算符的功能略有不同,因此您不能仅仅比较它们的速度。 - Mark Baker
3
不过,为什么不自己进行一些测试并查看它是否真的有那么大的差异呢?请注意,您可能会发现答案会因您处理的数据量而有所不同! - Mark Baker
http://php.net/manual/en/function.microtime.php - baao
1
你的代码中哪一部分是最慢的? - Salman A
除非您的数组有数百万条记录或者您执行了成千上万次合并,否则差异微乎其微。如果您想要进行优化,那么请优化您的数据库查询,减少对文件和外部资源的访问。此外,请注意 array_merge()+ 不同,当两个数组具有相同的键时,它们会产生不同的结果。 - axiac
显示剩余2条评论
3个回答

4

在PHP 7.1.5上,使用两个小的多维数组进行10000000次迭代:

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

所以加法运算符更快,但如果有冲突,结果会不同。


2

最重要的是代码可读性。这些微小的优化通常是错误的,因为你应该尽可能编写最干净的代码,然后通过分析来进行优化。

如果你想加速或者分析时间,我建议使用xdebug,并使用类似cachegrind的工具来查看输出。


3
除此之外,我也不知道为什么人们不自己尝试去看哪一个更快。 - Linesofcode
不确定我们是否可以将其视为微优化,因为差异很明显。 - gsouf

1

我发现以下测试结果不确定:

(注:此处为IT技术相关内容,无法简单翻译)

$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 +

结论

在整个代码库中使用任何一种方式或将它们全部重构为更易读的那种方式。对我来说,那就是数组并集运算符 (+)。请注意,只有对于关联数组,两者才会产生相同的结果(前提是您正确地改变操作数的顺序)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接