2016-11-12 92 views
0

我很想知道.includes()方法使用什么算法?它是否使用像rabin karp这样的模块化哈希?.includes()算法和速度?

我对使用.includes()有些犹豫,不知道更多关于它的方法和速度。我发现的文档在讨论它时没有详细说明(例如https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/String/includes

+0

我一直以为它在它下面使用'indexOf',但我不确定... –

+2

它最有可能只是语法糖,并且在引擎盖下使用与'indexOf'相同的方法,但它实际上是如何实现的直到供应商。 – adeneo

+2

实现未定义。您要求分析每个JavaScript引擎的来源。 有些表现会更好,有些表现会比预期更差。 – Norguard

回答

2

鉴于不同的引擎可能以不同的方式实现,因此可能难以就实现进行一揽子陈述。然而,通过做一些基准测试,应该有可能了解它的速度(因为测试可能是唯一确定的方法)。

使用节点7.0我试图测试三种不同的功能:
1.包括(),传递顺序阵列
2.基本for循环中,通过在连续阵列
3.具有(),传递在从一个序列阵列中预先创建的集合

我得到的结果表明阵列本身的长度似乎并不重要(如所希望的那样),但是从一开始的期望数目有多远。为找到索引< 20左右的数字,for循环看起来稍微快一些(大概是15%左右?)。对于较大的索引,包括()over会采用for循环(由指数500看起来快2-3倍)。然而.has()在后面的索引处找到数字要快得多(索引800加快了25-30倍),索引的大小似乎对其速度影响不大(但创建集合需要时间)。

无可否认,这些测试是有限的,许多因素都可能影响它们。一个有趣的结果是,如果一个集合是从传入的数组(而不是其他数组)中创建的,即使该集合没有传入函数,它似乎会增加包含的速度,并降低for循环功能略有。某种类型的缓存,以某种方式有益.includes()我会假设?

0

Rabin-Karp算法是一种字符串搜索算法,但是您已经链接了数组includes()算法,它与字符串搜索,不依赖于序列。 ECMA specification指示实现的方式描述了它的行为:它按照升序将SameValueZero应用于每个元素。给出这个描述,任何正常的算法将是O(n)时间和O(1)内存。另一方面,

String.indexOf,另一方面,没有这样一个挑剔的规范,V8 uses a Boyer-Moore-Horspool string search实施。