【问题标题】:Which is faster in PHP, $array[] = $value or array_push($array, $value)?PHP 中哪个更快,$array[] = $value 还是 array_push($array, $value)?
【发布时间】:2010-10-08 06:33:32
【问题描述】:

在 PHP 中附加数组成员更好用,

$array[] = $value;

array_push($array, $value);

?

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

【问题讨论】:

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

标签: php arrays performance


【解决方案1】:

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

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

【讨论】:

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

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      来自PHP documentation for array_push

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

      【讨论】:

      • 有趣的是,你的答案是第一个,但被投票的次数越少。
      【解决方案5】:

      我个人觉得$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 梳理你的代码库不是。不要仅仅因为它存在就过早地敲打过早的优化是邪恶的鼓。
      【解决方案6】:

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

      上面写着documentation

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

      【讨论】:

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

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

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

      打印1,2,3,4

      【讨论】:

        【解决方案8】:

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

        【讨论】:

          【解决方案9】:

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

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

          【讨论】:

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