2016-11-12 68 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實施。