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

Posted

技术标签:

【中文标题】PHP 中哪个更快,$array[] = $value 还是 array_push($array, $value)?【英文标题】:Which is faster in PHP, $array[] = $value or array_push($array, $value)? 【发布时间】:2011-01-26 18:15:16 【问题描述】:

php 中附加数组成员更好用,

$array[] = $value;

array_push($array, $value);

?

虽然手册上说最好避免函数调用,但我也读过$array[]array_push() 慢得多。有哪些说明或基准?

【问题讨论】:

$myArray[] = 123;这将比 array_push 函数更快。它直接将值添加到该数组中。函数对该变量具有单独的堆栈。并且它可能在该函数中包含该语句。 【参考方案1】:

我个人觉得$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 更快。很有趣。

【讨论】:

像这样的微优化很少值得付出努力。如果您是从头开始编写它,请按照最有意义的方式进行操作,然后,如果生成页面有点慢,请对其进行概要分析。一直到不得不改变这样的东西来加快速度的可能性很小。 只是为了确保,由于代码似乎与输出不匹配,我验证$array[] 确实快得多,在我的机器上进行 1M 分配的 300 毫秒与 2000 毫秒。但是,在 array_push 中一次添加 20 个项目大约与 20 $array[] =s 一样快。 @AlisterBulman 如果您正在考虑返回整个代码库并“优化”它,那么微优化是不值得的。但是,如果您有几种不同的方式来做同一件事,并且知道其中一种方式比其他方式更好(甚至只是一点点),那么您可以养成使用这种方式的习惯。你为什么不这样做? @AlisterBulman 我必须强烈反对,或者至少部分反对,如果你知道得更好,写得更好,但不要花太多精力去搜索可能 微优化... 提醒任何旁观者:并非所有的小优化都是“过早的优化”,正如 Knuth 所说,它是万恶之源。一些快一点的东西只是快一点的东西。记住 $array[]=$s 是可以的,为 array_push 梳理你的代码库不是。不要仅仅因为它存在就过早地敲打过早优化是邪恶的鼓。【参考方案2】:

array_push() 的主要用途是可以将多个值压入数组的末尾。

上面写着documentation:

如果你使用array_push()加一个 数组中的元素最好 使用 $array[] = 因为那样 调用 a 没有开销 功能。

【讨论】:

没错。有谁知道现实世界的场景,您必须一次向数组添加多个值?在我看来,这一定是一个非常罕见的情况,因为我从 2004 年开始编写 PHP(PHP4 仍然是实际的),而我从未使用过它。【参考方案3】:

来自PHP documentation for array_push

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

【讨论】:

有趣的是,你的答案是第一个,但被投票的次数越少。【参考方案4】:

人们普遍认为 [] 更快,因为没有函数调用的开销。另外,没有人真正喜欢 PHP 的数组函数……

“是……干草堆,针……还是针草堆……啊,他妈的……[] =”

【讨论】:

嗯? PHP 的数组函数很棒。 功能上它们很棒,是的,但他指的是不一致的命名方案。 您应该在 IDE 中打开参数提示。但我同意,一些一致性会很棒。 我同意这一点。命名方案(x_y 或 xy 或 y_x ...)和参数 logic 都没有一致性(首先,最后,在数组,字符串和正则表达式之间传递目标对象,祝你好运找到一个共同的规则!)。 FWIW,我喜欢 needle/haystack 命名约定,并且发现它很容易记住,因为它与短语的顺序相同:"like find a大海捞针 (1) 大海捞针 (2)"【参考方案5】:

一个区别是您可以使用两个以上的参数调用 array_push(),即您可以一次将多个元素推送到一个数组。

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

打印1,2,3,4

【讨论】:

【参考方案6】:

一个简单的 $myarray[] 声明会更快,因为您只是将一个项目推入项目堆栈,因为函数不会带来开销。

【讨论】:

【参考方案7】:

由于“array_push”是一个函数,在循环内被多次调用,所以会分配内存到栈中。

但是当我们使用 $array[] = $value 时,我们只是为数组赋值。

【讨论】:

【参考方案8】:

第二个是函数调用,所以通常它应该比使用核心数组访问特性慢。但我认为即使是脚本中的一个数据库查询也会超过对 array_push() 的 1000000 次调用。

请参阅此处了解使用 1000000 次插入的快速基准测试:https://3v4l.org/sekeV

【讨论】:

您能否证实您的主张,例如有一些粗略的计算?请通过editing (changing) your answer 回复,而不是在 cmets 中(但 without "Edit:"、"Update:" 或类似的 - 答案应该看起来像是写的今天)。【参考方案9】:

我只是不想添加:int array_push(...) 返回 数组中的新元素数 (PHP documentation)。它比$myArray[] = ...; $total = count($myArray); 更有用且更紧凑。

当变量用作堆栈时,array_push(...) 也有意义。

【讨论】:

以上是关于PHP 中哪个更快,$array[] = $value 还是 array_push($array, $value)?的主要内容,如果未能解决你的问题,请参考以下文章

哪个更快,array_key_exists 或 array_search? [复制]

堆上的二维数组,哪个版本更快?

PHP,单引号或双引号中哪个更快? [复制]

PHP面试题

for vs foreach vs while 哪个在 php 中遍历数组更快

PHP未设置与array_pop?