哪个更快,array_key_exists 或 array_search? [复制]
Posted
技术标签:
【中文标题】哪个更快,array_key_exists 或 array_search? [复制]【英文标题】:which is faster, array_key_exists or array_search? [duplicate] 【发布时间】:2012-01-14 02:52:03 【问题描述】:可能重复:What’s quicker and better to determine if an array key exists in php?
假设我想将我的好友列表存储在内存缓存中。 有时我需要搜索用户是否在我的列表中,有时我需要获取所有朋友列表。
你愿意
$friends[] = $friend
或
$friends[$friend] = 1;
基本原理是在不影响速度的情况下尽可能多地节省内存。 我没有找到任何可以帮助我解决小困境的 php 5.3.8 案例研究: 在负载下,哪个执行速度更快?
array_key_exists 还是 in_array? (即:foo 是 bar 的朋友吗?)
另外,有时我需要获取整个朋友列表,所以我需要迭代整个列表以构建朋友数组。完全不确定第二种方法,因为我还不知道是否会有更多的 array_search|array_key_exists|in_array 或获取完整的朋友列表。
有什么想法吗?
【问题讨论】:
您是否尝试过自己制作基准脚本并对其进行测试?这也是 SO 上几乎所有其他 php 数组速度问题的副本...... 还没有,我当然可以对此做一些基准测试。我很想知道是否有人真的可以争论这里的良好做法应该是什么。我将发布基准 良好实践很大程度上取决于您所处的环境。我以前因为我的环境因素不同而被别人追随(什么有效)而被烧毁。 (+当你自己做东西时你会发现令人惊讶的东西) @DaveRandom 不是骗子,因为array_search()
和 array_key_exists()
做不同的事情 :)
@Jack array_search
从一开始就没有地方可待。
【参考方案1】:
您可以自己运行一个简单的测试。无论如何,如果$friends
应该包含唯一元素(没有重复值!!),您可以使用键来存储它们。
我认为 PHP 检查密钥(array_key_exists()
或简单的 isset($array[$key])
)会更快。要搜索一个值,PHP 必须循环遍历数组;搜索关键字 PHP 将使用哈希函数。
您可以阅读更多on ***。
【讨论】:
【参考方案2】:array_key_exists
更快。 array_search
必须遍历整个数组,所以是 O(n)。 array_key_exists
是哈希表查找,所以是 O(1)。
如果您不熟悉此概念,请参阅http://en.wikipedia.org/wiki/Big_O_notation。
在array_key_exists
和isset
之间,虽然两者都非常快[O(1)],但isset
明显更快。如果这个检查发生了数千次,你会想要使用 isset。
需要注意的是,它们并不相同——当数组键存在但值为null
时,isset
将返回false,array_key_exists
将返回true。如果值可能是null
,则需要使用array_key_exists
。
【讨论】:
您是否有特定资源声称 isset 的速度要快得多? 我在一个大型代码库中进行了这项更改,并测量了当时的改进。我建议您自己进行快速测试。在此处查看我的示例基准脚本:***.com/questions/4518404/… 好的,很好的基准测试,谢谢!但是,我发现更快的“替代方案”是issset()
,幅度很大(20-50%)。请参阅juliusbeckmann.de/blog/…、php.net/manual/en/function.array-key-exists.php#82867 或zomeoff.com/…。但是需要注意的是,如果键存在但值为 NULL,则 isset() 返回 false。
我找到了另一个可以确认的基准:codepad.org/RcdAewVF以上是关于哪个更快,array_key_exists 或 array_search? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
哪个查询更快:在 Amazon Redshift 中使用 order by 时 top X 或 limit X
indexOfObjectsPassingTest 或 filteredArrayUsingPredicate 哪个性能更快?