哪个更快,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_existsisset 之间,虽然两者都非常快[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

PHP,单引号或双引号中哪个更快? [复制]

哪个更快: glob() 或 opendir()

哪个更快?常量、变量或变量数组

插入、更新或删除 MongoDB 或 SQL 哪个更快?

indexOfObjectsPassingTest 或 filteredArrayUsingPredicate 哪个性能更快?