cas*_*rco 6 php performance search
我怀疑在数组中进行快速搜索的更好方法是什么(我在谈论具体情况).
假设我有一个数组L = [A,B,C](当我开始时).当程序运行时,可能L会增长(但到最后),我将进行搜索的一种可能情况是L = [A,B,C,D,E].
事实是,当我搜索时,我想要找到的值可能只有D和E.现在我正在使用find_array(elem,array),但是这个函数不能被"调整"到搜索开始结束并减少索引,我"害怕"对于所有搜索,函数in_array将检查所有具有较低索引的元素,然后才能找到我正在搜索的值.
¿有另一种搜索功能更适合我的问题吗?¿如何在in_array函数内部工作?
提前致谢
我假设这in_array是从0到n-1的线性搜索.
最快的搜索方式是将值存储为键并使用array_key_exists.
$a['foo'] = true;
$a['bar'] = true;
if (array_key_exists('foo', $a)) ...
Run Code Online (Sandbox Code Playgroud)
但是,如果这不是一个选项,您可以非常轻松地为索引数组创建自己的选项:
function in_array_i($needle, array $a, $i = 0);
{
$c = count($a);
for (;$i < $c; ++$i)
if ($a[$i] == $needle) return true;
return false;
}
Run Code Online (Sandbox Code Playgroud)
它将从$i,您可以跟踪自己,以跳过第一个元素.
或者......
function in_array_i($needle, array $a, $i = 0);
{
return in_array($needle, $i ? array_slice($a, $i) : $a);
}
Run Code Online (Sandbox Code Playgroud)
您可以通过基准测试来查看哪个更快.
调整广泛的比较测试
对于数字和字符串搜索,作者 Kasim Kochkin 在GitHub上发布,我发现以下结果
使用 PHP 7.3.11
使用 array_flip 一次和多次搜索,
对于单个或少量搜索,in_array 和 array_search 速度更快。
对于字符串搜索,翻转(一次)+ isset 在 200 次以上搜索时变得更快。
对于数字搜索,翻转(一次)+ isset 在 10 次以上搜索时变得更快。
字符串搜索的结果(以秒为单位)
| N(数组大小) | 数组中 | 翻动 | 伊塞特 | 数组搜索 | 数组键存在 |
|---|---|---|---|---|---|
| 1,000,000 | 0.00845003 | 0.17343211 | 2.86E-6 | 0.00835395 | 5.01E-6 |
| 100,000 | 0.00854707 | 0.12469196 | 7.15E-6 | 0.00861216 | 6.2E-6 |
| 10,000 | 0.00854087 | 0.10549212 | 6.91E-6 | 0.00846505 | 4.05E-6 |
数字搜索结果(以秒为单位),
| N(数组大小) | 数组中 | 翻动 | 伊塞特 | 数组搜索 | 数组键存在 |
|---|---|---|---|---|---|
| 1,000,000 | 0.01197696 | 0.06217289 | 6.2E-6 | 0.01673698 | 4.05E-6 |
| 100,000 | 0.01191092 | 0.06582093 | 6.91E-6 | 0.01637983 | 4.05E-6 |
| 10,000 | 0.01375008 | 0.07185006 | 5.01E-6 | 0.01485705 | 4.05E-6 |
| 归档时间: |
|
| 查看次数: |
11275 次 |
| 最近记录: |