array_merge VS 直接阵列注入性能



它们在性能或任何方面有什么区别吗?

$a = ['a' => 1, 'b' => 2, 'c' => 3];
$b = ['d' => 4, 'e' => 5, 'f' => 6];
$c = array_merge($a, $b);

$a = [];
$a['a'] = 1;
$a['b'] = 2;
$a['c'] = 3;
$b = [];
$b['d'] = 4;
$b['e'] = 5;
$b['f'] = 6;
$c = array_merge($a, $b);

$a = [];
$a = ['a' => 1, 'b' => 2, 'c' => 3];
$a['d'] = 4;
$a['e'] = 5;
$a['f'] = 6;

首先,像这样的微优化通常是没有意义的,除非你有大量的请求要处理或非常大的数据集。话虽如此...

选项1 和选项 2 应提供大致相同的性能。但是,第一个选项会稍微快一些,因为不需要动态扩展数组 A 和数组 B,这是第二个示例中所必需的。

但是,前两个示例都使用array_merge(),这引入了实际进行函数调用的开销,并且仍然需要检查键是否实际存在。 请注意,当字符串键已存在时,array_merge会覆盖该元素。但是,请记住,对于具有数字键的元素,不会这样做。在这种情况下,没有这样的检查,也不会覆盖任何内容;键和元素只是追加到目标数组的末尾。以下是 PHP 文档的解释:

如果输入数组具有相同的字符串键,则该键的后一个值将覆盖前一个值。但是,如果数组包含数字键,则后面的值不会覆盖原始值,而是会追加。带有数字键的输入数组中的值将使用结果数组中从零开始的递增键重新编号。 https://www.php.net/manual/en/function.array-merge.php

当然,使用array_merge()的好处是您可以一目了然地知道它的作用。

这是我的基准测试,它比较了将$b项直接插入$a与合并$a并使用array_merge()创建新数组$b。两个初始数组中都有 100 万个项目。

<?php

$a = [];
$b = [];
/*Insert 1000000 elements into array $a with string keys starting at '0' and ending at '999999'*/
for ($i = 0; $i < 1000000; $i++)
{
$a["{$i} "] = $i;
}
/*Insert 1000000 elements into array $b with string keys starting at '1000000' and ending at '1999999' */
for ($j = 1000000; $j < 2000000; $j++)
{
$b["{$j} "] = $j;
}

$temp = $a;
/*Inserting the values of $b into $temp in a loop*/
$start = microtime(true);
foreach($b as $key => $current)
{
$temp[$key] = $current;  
}   
$end = microtime(true);
$runtime = $end - $start;
$output =  "<p>Inserted elements of array a and b with assignment in %.10f ({$runtime}) seconds</p>";
echo sprintf($output, $runtime);

/*Using array_merge to merge $a and $b */   
$start = microtime(true);
$c = array_merge($a, $b);
$end = microtime(true);

$runtime = $end - $start;
$output =  "<p>Merged array a and b with array_merge() in %.10f  ({$runtime}) seconds </p>";
echo sprintf($output, $runtime);

输出:

插入数组 a 和 b 的元素,赋值时间为 0.1125514507 (0.11255145072937) 秒

在 0.0289690495 (0.028969049453735) 秒内将数组 a 和 b 与 array_merge() 合并。

我修改了基准测试,使其在赋值测试中使用临时数组,因此永远不会修改$a和$b。然而,运行时间的差异仍然存在。为了获得良好的平均值,我运行了 1000 次,取了两次运行时间的平均值。最终结果与最初的运行没有太大区别。第一种方法的平均时间约为0.1012秒,而merge_array()方法的平均时间为0.0574秒。这大约相差 0.0438 秒或 43.8 毫秒。

因此,平均而言,您会看到大约 57% 的性能差异。这很有趣,因为我发现array_merge()旧版本的 PHP 中很慢。但是,从 7.3 开始,看起来应该选择array_merge()而不是手动合并带有字符串键的数组。

最新更新