就目前的情况而言,此问题不适合我们的问答格式。我们希望答案能得到事实、参考资料或专业知识的支持,但此问题可能会引发辩论、争论、民意调查或广泛讨论。如果您认为此问题可以改进并可能重新讨论,请访问visit the help center以获取指导。
10年前关闭了。
这个问题只是对我来说,因为我总是喜欢写优化的代码,也可以运行在廉价缓慢的服务器(或服务器与大量的流量)
我环顾四周,没有找到答案,我想知道这两个例子中哪一个更快,记住数组的键在我的例子中并不重要(当然是伪代码):
<?php
$a = array();
while($new_val = 'get over 100k email addresses already lowercased'){
if(!in_array($new_val, $a){
$a[] = $new_val;
//do other stuff
}
}
?>
<?php
$a = array();
while($new_val = 'get over 100k email addresses already lowercased'){
if(!isset($a[$new_val]){
$a[$new_val] = true;
//do other stuff
}
}
?>
由于问题的重点不是数组冲突,我想补充一点,如果您担心$a[$new_value]
的插入冲突,可以使用$a[md5($new_value)]
。它仍然会导致冲突,但在读取用户提供的文件(http://nikic.github.com/2011/12/28/Supercolliding-a-PHP-array.html)时可以避免可能的DoS攻击
4条答案
按热度按时间jtw3ybtb1#
到目前为止,答案都是正确的。在这种情况下使用
isset
更快,因为in_array
必须检查每个值,直到找到匹配。in_array
内置函数要小。这可以通过使用一个值为10,000的数组(在下面的测试中为10,000),强制
in_array
执行更多搜索来演示。这是建立在Jason的基准之上的,它填充了一些随机值,偶尔会找到数组中存在的一个值。所有这些都是随机的,所以要注意时间会波动。
0s7z1bwu2#
哪个更快:
isset()
与in_array()
isset()
速度更快。显然,
isset()
只测试单个值,而in_array()
将遍历整个数组,测试每个元素的值。使用
microtime()
进行粗略的基准测试非常容易。结果:
代码:
其他资源
我鼓励你也看看:
b4lqfgs43#
使用
isset()
可以利用更快的查找速度,因为它使用hash table,避免了O(n)
搜索。首先使用djb hash function对密钥进行散列,以确定
O(1)
中经过类似散列的密钥桶,然后迭代搜索该桶,直到在O(n)
中找到准确的密钥。除了intentional hash collisions之外,这种方法产生的性能远远优于
in_array()
。请注意,当以您所展示的方式使用
isset()
时,将最终值传递给另一个函数需要使用array_keys()
创建一个新数组。将数据同时存储在键和值中可能会导致内存损失。查看代码设计决策如何影响运行时性能的一个好方法是查看脚本的compiled version:
in_array()
不仅使用相对低效的O(n)
搜索,而且还需要作为函数(DO_FCALL
)调用,而isset()
为此使用单个操作码(ZEND_ISSET_ISEMPTY_DIM_OBJ
)。i2byvkas4#
第二种方法会更快,因为它只查找特定的数组键,不需要迭代整个数组直到找到它(如果没有找到,将查看每个数组元素)