我有两个带有唯一数字键的数组。如何更快地合并它们?
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 +
唏嘘
使用整个代码库中使用的任何一种,或者将它们全部重构为您认为更具可读性的那个。对我来说,这就是数组联合运算符(+
)。请注意,两者仅对关联数组产生相同的结果(假设您正确更改了操作数的顺序)。