在PHP中,$array[] = $value 和 array_push($array, $value) 哪个更快?

137

在PHP中添加数组元素,使用哪种方法更好?

$array[] = $value;
或者
array_push($array, $value);

尽管手册上建议避免函数调用,但我也读到过 $array[]array_push() 慢得多。有哪些澄清或基准测试?


2
$myArray[] = 123;这将比array_push函数更快。它直接将值添加到该数组中。函数具有单独的变量堆栈,它可能在函数内部具有该语句。 - sganesh
9个回答

180
我个人认为$array[]更加清晰易读,而且如果你不打算向数组中添加成千上万个字符串,那么毫秒级别的区别其实并不重要。
我运行了这段代码:
$t = microtime(true);
$array = array();
for($i = 0; $i < 10000; $i++) {
    $array[] = $i;
}
print microtime(true) - $t;
print '<br>';
$t = microtime(true);
$array = array();
for($i = 0; $i < 10000; $i++) {
    array_push($array, $i);
}
print microtime(true) - $t;

使用$array[]的第一种方法比第二种方法快近50%。

一些基准测试结果:

Run 1
0.0054171085357666 // array_push
0.0028800964355469 // array[]

Run 2
0.0054559707641602 // array_push
0.002892017364502 // array[]

Run 3
0.0055501461029053 // array_push
0.0028610229492188 // array[]

这并不令人惊讶,因为PHP手册指出:

如果您使用array_push()向数组添加一个元素,最好使用$array[] =,因为这样就没有调用函数的开销。

从措辞上看,如果添加多个值,使用array_push可能更有效率。出于好奇,我进行了进一步测试,即使对于大量添加,逐个使用$array[]调用比使用一个大的array_push更快。有趣。

12
像这样的微小优化很少值得付出努力。如果你是从头开始写,那就按照最合理的方式去做,只有当生成页面有点慢时,才需要进行性能分析。要改变类似这样的东西来加快速度的机会很少。 - Alister Bulman
5
为了确保代码似乎与输出不匹配,我验证了在我的机器上进行100万次赋值时,$array[] 确实比较快,只需要300毫秒,而不是2000毫秒。然而,使用 array_push 一次性添加20个元素的速度几乎与使用20个 $array[] = 相同。 - Elle
7
如果你正在考虑回顾整个代码库并“优化”它,微小的优化并不值得花费精力。然而,如果你有几种不同的方式来完成同一件事情,并且知道其中一种方法比其他方法更好(即使只是稍微好一点),那么你可以养成使用这种方式的习惯。为什么不这样做呢? - Okonomiyaki3000
3
@AlisterBulman 我必须强烈反对,或者至少是部分地反对,“如果你知道得更好,就写得更好”,但不要花太多精力去寻找可能的微观优化... - jave.web
2
提醒任何旁观者:并非所有的小优化都是 Knuth 所说的万恶之源“过早优化”。有些小的加速只是小的加速。记住 $array[]=$s 是可以的,但为了使用 array_push 而搜索你的代码库则不行。不要仅仅因为它存在就过早地敲打“过早优化是邪恶的”鼓。 - Plasmarob
显示剩余8条评论

46

array_push() 的主要作用是可以将多个值添加到数组的末尾。

根据文档所述:

如果您使用 array_push() 添加一个元素到数组中,最好使用 $array[] = 的方式,因为这样不需要调用函数,没有额外的开销。


没错。 有人知道一个真实的场景,需要一次性向数组添加多个值吗?在我看来,这必须是一个非常罕见的情况,因为我自2004年以来就一直在编写PHP(当时还使用PHP4),但我从未使用过它。 - Alexander Behling


25

街上的传言是[]比较快,因为没有函数调用的开销。而且,没人真的喜欢PHP的数组函数...

"是... 针筒,还是 针筒针...啊,见鬼了...[] = "


10
哎?PHP的数组函数很棒。 - cletus
18
它们在功能上非常棒,但他指的是不一致的命名方案。 - ryeguy
2
你应该在你的IDE中打开参数提示。但我同意,一些一致性会更好。 - Pim Jager
4
我同意这个观点。无论是在命名方案(x_y、xy或y_x...)还是在参数逻辑(首先/最后传递目标对象,位于数组、字符串和正则表达式之间,祝你好运找到共同规则!)方面都没有一致性。 - Déjà vu
5
就我个人而言,我喜欢“寻找针(1)在草堆(2)中”的命名惯例,并发现它很容易记住,因为它按照与该短语相同的顺序进行排序。FWIW是“仅供参考”的意思,此处可忽略。 - rybo111
显示剩余5条评论

8

一个不同之处是您可以使用多于两个参数调用array_push(),即您可以一次向数组推送多个元素。

$myArray = array();
array_push($myArray, 1,2,3,4);
echo join(',', $myArray);

打印输出 1,2,3,4


2
一个简单的$myarray[]声明会更快,因为你只是将一个项目推到项目堆栈中,由于没有函数带来的开销。

2

由于"array_push"是一个函数,并且在循环内部调用多次,因此它会将内存分配到堆栈中。

但是当我们使用 $array[] = $value 时,我们只是将一个值赋给了数组。


1

第二个是函数调用,因此通常比使用核心数组访问功能要慢。但我认为即使在脚本中进行一次数据库查询,也会比1000000次对array_push()的调用更重要。

请参见这里,进行1000000次插入的快速基准测试:https://3v4l.org/sekeV


你能否用一些粗略的计算来证实你的说法?请通过编辑(更改)你的答案来回复,而不是在评论区回复(但是不要加上“编辑:”,“更新:”或类似的字眼——答案应该看起来像是今天写的)。 - Peter Mortensen

0
我只想补充一下:int array_push(...) 返回数组中新元素的数量(PHP documentation)。这比$myArray[] = ...; $total = count($myArray);更加有用和紧凑。

此外,当变量用作堆栈时,array_push(...) 是有意义的。


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