Dan*_*ath 95 php arrays performance standards semantics
关于' 如何判断PHP数组是否为空 '的这个问题让我想到了这个问题
是否有理由count应该使用而不是empty在确定数组是否为空时?
我个人的想法是,如果2应该使用空数组的情况是等价的,empty因为它给出了布尔问题的布尔答案.从上面链接的问题来看,这似乎count($var) == 0是流行的方法.对我而言,虽然技术上正确,但毫无意义.例如Q:$ var,你是空的吗?答:7.嗯...
有没有理由我应该使用count == 0或仅仅是个人品味的问题?
正如其他人在对现在删除的答案的评论中指出的那样,count对大型数组会有性能影响,因为它必须计算所有元素,而empty一旦知道它不为空就可以停止.那么,如果他们在这种情况下给出相同的结果,但count可能效率低下,为什么我们会使用count($var) == 0?
pro*_*son 93
我一般用empty.我不确定为什么人们会真正使用计数 - 如果数组很大,那么计数需要更长/更多的开销.如果您只需要知道数组是否为空,则使用空.
Sat*_*ake 44
我很想知道哪一个实际上更快,所以我制作了一个简单的脚本来对这些功能进行基准测试.
<?php
function benchmark($name, $iterations, $action){
$time=microtime(true);
for($i=0;$i<=$iterations;++$i){
$action();
}
echo $name . ' ' . round(microtime(true)-$time, 6) . "\n";
}
$iterations = 1000000;
$x = array();
$y = range(0, 10000000);
$actions = array(
"Empty empty()" => function() use($x){
empty($x);
},
"Empty count()" => function() use($x){
count($x);
},
"Full empty()" => function() use($y){
empty($y);
},
"Full count()" => function() use($y){
count($y);
},
############
"IF empty empty()" => function() use($x){
if(empty($x)){ $t=1; }
},
"IF empty count()" => function() use($x){
if(count($x)){ $t=1; }
},
"IF full empty()" => function() use($y){
if(empty($y)){ $t=1; }
},
"IF full count()" => function() use($y){
if(count($y)){ $t=1; }
},
############
"OR empty empty()" => function() use($x){
empty($x) OR $t=1;
},
"OR empty count()" => function() use($x){
count($x) OR $t=1;
},
"OR full empty()" => function() use($y){
empty($y) OR $t=1;
},
"OR full count()" => function() use($y){
count($y) OR $t=1;
},
############
"IF/ELSE empty empty()" => function() use($x){
if(empty($x)){ $t=1; } else { $t=2; }
},
"IF/ELSE empty count()" => function() use($x){
if(count($x)){ $t=1; } else { $t=2; }
},
"IF/ELSE full empty()" => function() use($y){
if(empty($y)){ $t=1; } else { $t=2; }
},
"IF/ELSE full count()" => function() use($y){
if(count($y)){ $t=1; } else { $t=2; }
},
############
"( ? : ) empty empty()" => function() use($x){
$t = (empty($x) ? 1 : 2);
},
"( ? : ) empty count()" => function() use($x){
$t = (count($x) ? 1 : 2);
},
"( ? : ) full empty()" => function() use($y){
$t = (empty($y) ? 1 : 2);
},
"( ? : ) full count()" => function() use($y){
$t = (count($y) ? 1 : 2);
}
);
foreach($actions as $name => $action){
benchmark($name, $iterations, $action);
}
//END
Run Code Online (Sandbox Code Playgroud)
由于我这样做,我还试图检查执行通常与count()/ empty()相关的操作的性能
使用PHP 5.4.39:
Empty empty() 0.118691
Empty count() 0.218974
Full empty() 0.133747
Full count() 0.216424
IF empty empty() 0.166474
IF empty count() 0.235922
IF full empty() 0.120642
IF full count() 0.248273
OR empty empty() 0.123875
OR empty count() 0.258665
OR full empty() 0.157839
OR full count() 0.224869
IF/ELSE empty empty() 0.167004
IF/ELSE empty count() 0.263351
IF/ELSE full empty() 0.145794
IF/ELSE full count() 0.248425
( ? : ) empty empty() 0.169487
( ? : ) empty count() 0.265701
( ? : ) full empty() 0.149847
( ? : ) full count() 0.252891
Run Code Online (Sandbox Code Playgroud)
使用HipHop VM 3.6.1(dbg)
Empty empty() 0.210652
Empty count() 0.212123
Full empty() 0.206016
Full count() 0.204722
IF empty empty() 0.227852
IF empty count() 0.219821
IF full empty() 0.220823
IF full count() 0.221397
OR empty empty() 0.218813
OR empty count() 0.220105
OR full empty() 0.229118
OR full count() 0.221787
IF/ELSE empty empty() 0.221499
IF/ELSE empty count() 0.221274
IF/ELSE full empty() 0.221879
IF/ELSE full count() 0.228737
( ? : ) empty empty() 0.224143
( ? : ) empty count() 0.222459
( ? : ) full empty() 0.221606
( ? : ) full count() 0.231288
Run Code Online (Sandbox Code Playgroud)
结论如果你使用PHP:
在两种情况下,empty()都比count()快得多,其中包含一个空的填充数组
count()对完整或空数组执行相同的操作.
做一个简单的IF或只是一个布尔运算是一样的.
IF/ELSE比(?:)更有效.除非你在中间用表达式进行数十亿次迭代,否则它是完全无关紧要的.
结论如果你正在使用HHVM:
empty()比count()快一点,但是微不足道.
[其余与PHP相同]
在结论的结论中,如果你只需要知道数组是否为空,则总是使用empty();
这只是一个奇怪的测试,只是在没有考虑很多因素的情况下完成.它只是一个概念证明,可能无法反映生产中的操作.
Lau*_*tin 15
我认为这只是个人偏好.有些人可能会说empty更快(例如http://jamessocol.com/projects/count_vs_empty.php),而其他人可能会说count更好,因为它最初是为数组制作的.empty更通用,可以应用于其他类型.
php.net提供以下警告count:
对于未设置的变量,count()可能返回0,但对于已使用空数组初始化的变量,它也可能返回0.使用isset()来测试是否设置了变量.
换句话说,如果未设置变量,您将收到PHP的通知,说它未定义.因此,在使用之前count,最好检查变量isset.这不是必需的empty.
dev*_*ler 10
在确定数组是否为空时,是否有理由应该使用count而不是empty?
当你需要在非空数组上做某事时知道它的大小:
if( 0 < ( $cnt = count($array) ) )
{
echo "Your array size is: $cnt";
}
else
echo "Too bad, your array is empty :(";
Run Code Online (Sandbox Code Playgroud)
但我不建议使用计数,除非你100%确定,你所计算的是一个数组.最近我一直在调试代码,其中错误函数返回FALSE而不是空数组,我发现的是:
var_dump(count(FALSE));
Run Code Online (Sandbox Code Playgroud)
输出:
int 1
Run Code Online (Sandbox Code Playgroud)
所以从那时起我正在使用empty或if(array() === $array)确定我的数组是空的.
count()似乎与实现的类似数组的接口更好地工作ArrayAccess/Countable.empty()即使它们没有元素,也会为这些类型的对象返回true.通常这些类将实现Countable接口,因此如果问题是"此集合是否包含元素?" 如果不对实施做出假设,那么这count()是一个更好的选择.
小智 5
或者,您可以将变量强制转换为布尔值(隐式或显式):
if( $value )
{
// array is not empty
}
if( (bool) $value )
{
// array is still not empty
}
Run Code Online (Sandbox Code Playgroud)
与此E_NOTICE类似,此方法确实生成了未定义变量的情况count().
有关更多信息,请参阅类型比较的PHP手册页.
| 归档时间: |
|
| 查看次数: |
65213 次 |
| 最近记录: |