我有两个具有唯一数字键的数组。如何更快地将它们合并?
在PHP 7.1.5上,使用两个小的多维数组进行10000000次迭代:
所以加法运算符更快,但如果有冲突,结果会不同。
最重要的是代码可读性。这些微小的优化通常是错误的,因为你应该尽可能编写最干净的代码,然后通过分析来进行优化。
如果你想加速或者分析时间,我建议使用xdebug,并使用类似cachegrind的工具来查看输出。
我发现以下测试结果不确定:
(注:此处为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 +
在整个代码库中使用任何一种方式或将它们全部重构为更易读的那种方式。对我来说,那就是数组并集运算符 (+
)。请注意,只有对于关联数组,两者才会产生相同的结果(前提是您正确地改变操作数的顺序)。
+
运算符的功能略有不同,因此您不能仅仅比较它们的速度。 - Mark Bakerarray_merge()
和+
不同,当两个数组具有相同的键时,它们会产生不同的结果。 - axiac