PHP数组:count还是sizeof?

Ben*_*Ben 206 php

要查找PHP中的元素数量$array,哪个更快/更好/更强?

count($array)还是sizeof($array)

编辑

感谢Andy Lester,我从多语言角度提炼了我的问题.手动评论者说

"[sizeof]在基于C的许多其他语言中并不相同"

这是真的?

ale*_*lex 181

count()如果它们是相同的话我会使用它,因为根据我的经验它更常见,因此会减少开发人员阅读你的代码说" sizeof()那是什么?" 并且必须查阅文档.

我认为这意味着sizeof()它不像在C中那样工作(计算数据类型的大小).它可能使这个明确提到由于PHP是用C语言编写,并提供了大量具有相同名称的包装为C函数(strlen(),printf(),等)

  • “那是什么?”并且必须查阅文档。`这就是我来到这里的原因,哈哈 (4认同)

Rez*_*ngi 87

根据phpbench:

是否值得提前计算循环的长度?

//pre-calculate the size of array
$size = count($x); //or $size = sizeOf($x);

for ($i=0; $i<$size; $i++) {
    //...
}

//don't pre-calculate
for ($i=0; $i<count($x); $i++) { //or $i<sizeOf($x);
    //...
}
Run Code Online (Sandbox Code Playgroud)

给出了具有1000个键,具有1个字节值的循环.

预计算 - 计数()总时间:152μs

没有预计算 - 计数()总时间:70401μs

使用pre calc - sizeof()总时间:212μs

没有预计 - sizeof()总时间:50644μs

所以我个人更喜欢使用count()而不是sizeof() 和pre calc.

  • 你测试的是什么版本的php?较新的版本有很多优化,可能会使这些结果大不相同 (6认同)
  • 这个答案显示了在循环之前将计数缓存在变量中的好处。我不明白这与这个问题有什么关系。 (4认同)
  • 请仅告诉您花费更少的时间。否则答案也相当复杂和令人困惑!谢谢 (3认同)
  • 为什么sizeof更快而不将结果保存到变量中,否则反过来呢?这是php解释器中的一些糟糕的设计选择导致某种选择性开销吗?我想知道你是如何对此进行基准测试的,微秒测量让我担心.也许尝试在外部for循环中运行这么多次? (3认同)
  • @rubo77 参见上面的代码;“预计算”是在 for 循环之前确定一次数组的大小。如果没有“预计算”,则确定 for 循环内数组的大小 (3认同)
  • “预计算”是什么意思? (2认同)

And*_*ter 38

它们完全相同 sizeof()

在没有任何理由担心"更快"的情况下,总是为人类进行优化.哪个对人类读者更有意义?

  • @塔达斯V。他们已经在答案中提到了这一点,并指出“没有任何理由担心更快” (2认同)

And*_*off 18

根据网站,sizeof()是别名count(),所以他们应该运行相同的代码.也许sizeof()有一点开销,因为它需要解决它count()?它应该是非常小的.

  • 好吧,抱歉猜猜?我只是说他们实际上是同一件事.然后,我做了一个逻辑推理,使用函数的别名而不是实际的函数可能会非常慢,但是我真的不知道用"也许"这个词作为前缀.对不起,如果冒犯了你.也许下次我会用"无穷小"这个词. (51认同)

Meh*_*nya 7

我知道这很旧,但只想提及在PHP 7.2中尝试过的方法

<?php
//Creating array with 1 000 000 elements
$a = array();
for ($i = 0; $i < 1000000; ++$i)
{
    $a[] = 100;
}

//Measure
$time = time();
for ($i = 0; $i < 1000000000; ++$i)
{
    $b = count($a);
}
print("1 000 000 000 iteration of count() took ".(time()-$time)." sec\n");

$time = time();
for ($i = 0; $i < 1000000000; ++$i)
{
    $b = sizeof($a);
}
print("1 000 000 000 iteration of sizeof() took ".(time()-$time)." sec\n");
?>
Run Code Online (Sandbox Code Playgroud)

结果是:

1 000 000 000 iteration of count() took 414 sec
1 000 000 000 iteration of sizeof() took 1369 sec
Run Code Online (Sandbox Code Playgroud)

所以就用吧count()


Min*_*aie 6

sizeof()只是count() 这里提到的别名

http://php.net/manual/zh/function.sizeof.php

  • + alex是的。我看到两个链接。您是否期望他重写sizeof?哈哈:p (4认同)