Heim  >  Artikel  >  Web-Frontend  >  Warum Set.has() beim Suchen von Elementen schneller ist als Array.includes()

Warum Set.has() beim Suchen von Elementen schneller ist als Array.includes()

Susan Sarandon
Susan SarandonOriginal
2024-11-06 06:09:03346Durchsuche

Why Set.has() is Faster Than Array.includes() for Finding Items

Manchmal ist beim Erstellen von Anwendungen die Leistung der Schlüssel oder zumindest ein wesentlicher Treiber, insbesondere wenn es um große Datenmengen oder Echtzeitanforderungen geht. Eine der häufigsten Aufgaben in JavaScript besteht darin, zu prüfen, ob in einer Sammlung ein Wert vorhanden ist. Die beiden am häufigsten verwendeten Alternativen sind Array.includes() und Set.has(). Beide funktionieren, aber tatsächlich funktioniert Set.has() besser als Array.includes. Lassen Sie uns die Gründe dafür untersuchen und entscheiden, wann Sie eine der beiden Alternativen verwenden sollten.

Array.includes() vs. Set.has() verstehen

Es gibt zwei Methoden, die in ihrer Verwendung recht einfach zu sein scheinen, aber unterschiedliche Implementierungen haben, nämlich Array.includes() und Set.has().

Array.includes()

Die Methode Includes() prüft, ob ein bestimmter Wert in einem Array vorhanden ist.
Es nutzt die zeitliche Komplexität von O(n) aus, sodass die Wertprüfung umso länger dauert, je größer die Länge des Arrays ist.
Dies liegt daran, dass Array.includes() das Array von Anfang bis Ende durchsucht (oder bis der Wert gefunden wird) und je größer das Array ist, desto länger dauert es.

Set.has()

Die has()-Methode eines Sets prüft ebenfalls, ob ein bestimmter Wert vorhanden ist, geht aber viel schneller.
Set.has() basiert auf einer Hash-Tabellen-basierten Struktur, die eine zeitkonstante Suche oder O(1)-Zeitkomplexität ermöglicht.
Im Gegensatz zu Arrays ist Set für die Verarbeitung eindeutiger Werte konzipiert, sodass keine doppelten Werte enthalten sind und die Suchzeit länger ist.

Warum Set.has() für große Datenmengen schneller ist

Wenn Sie Set.has() verwenden, kann JavaScript das Element in einem direkten Vorgang finden, unabhängig davon, wie viele Elemente im Set enthalten sind. Wenn beispielsweise überprüft wird, ob sich ein Wert in einer Menge befindet, die eine Million enthält, ist der von Set.has() benötigte Zeitaufwand genau derselbe wie bei der Überprüfung von zehn.

Andererseits untersucht Array.includes() jedes Element der Reihe nach von links nach rechts, bis es entweder das gewünschte Element findet oder sein Ende erreicht. Das heißt, je länger die Größe ist, desto länger dauert die Überprüfung, insbesondere wenn ein Artikel kurz vor dem Ende steht – und auf jeden Fall, wenn der betreffende Artikel nicht mehr vorhanden ist.

Hier sehen Sie sich ein Beispiel genau an:

const bigArray = Array.from({ length: 1000000 }, (_, i) => i);
const bigSet = new Set(bigArray);

const valueToFind = 999999;

// Array.includes (O(n)) - Slower for large arrays
console.time("Array.includes");
bigArray.includes(valueToFind);
console.timeEnd("Array.includes");

// Set.has (O(1)) - Faster for large sets
console.time("Set.has");
bigSet.has(valueToFind);
console.timeEnd("Set.has");

Wenn Sie dies ausführen, sehen Sie, dass Set.has() Array.includes() bei großen Arrays bei weitem übertrifft. In der Praxis könnte dieser Unterschied durchaus zu flüssigeren Animationen, schnelleren Ladezeiten oder sogar einer geringeren Ressourcennutzung auf Ihrem Server führen.

Wann Set.has() und Array.includes() verwendet werden sollten

Das hängt alles davon ab, was Sie erreichen möchten. Hier eine kurze Zusammenfassung:

Verwenden Sie Set.has(), wenn:

  • Sie beschäftigen sich mit großen Datenmengen und führen viele Suchvorgänge durch.
  • Sie arbeiten mit eindeutigen Werten, beispielsweise einer Reihe eindeutiger Benutzer-IDs, Tags oder Schlüsselwörter.
  • Die geringen Vorabkosten einer Array-Konvertierung in ein
  • machen Ihnen nichts aus
  • Legen Sie fest, dass die Anzahl der späteren Suchvorgänge minimiert wird.

Verwenden Sie Array.includes(), wenn:

  • Ihr Datensatz ist klein und der Leistungsunterschied ist vernachlässigbar.
  • Sie müssen nur ein oder mehrere Male nach einem Artikel suchen, daher hat die Erstellung eines Sets keinen Vorteil.
  • Sie haben es mit Duplikaten zu tun, mit denen ein Satz nicht umgehen kann.

Beispielanwendungsfall

Stellen Sie sich vor, Sie implementieren eine Benutzersuchfunktion, die Namen anhand einer Liste blockierter Wörter filtert. Wenn Sie Hunderte blockierter Wörter haben und häufig suchen, kann die Verwendung eines Satzes für die blockierten Wörter die Überprüfung jeder Suche beschleunigen:

const bigArray = Array.from({ length: 1000000 }, (_, i) => i);
const bigSet = new Set(bigArray);

const valueToFind = 999999;

// Array.includes (O(n)) - Slower for large arrays
console.time("Array.includes");
bigArray.includes(valueToFind);
console.timeEnd("Array.includes");

// Set.has (O(1)) - Faster for large sets
console.time("Set.has");
bigSet.has(valueToFind);
console.timeEnd("Set.has");

Selbst in kleineren Fällen hilft ein Set dabei, die Dinge effizient und vorhersehbar zu halten. Und wenn die Liste blockierter Wörter wächst, verfügen Sie bereits über eine skalierbare Lösung.

Wichtige Erkenntnisse

  • Leistung: Set.has() bietet O(1)-Zeitkomplexität und ist damit viel schneller als Array.includes() mit O(n) für größere Sammlungen

  • Eignung: Das Set ist für eindeutige Werte konzipiert und daher natürlich für Suchvorgänge optimiert. Arrays sind bei doppelten Werten flexibler, prüfen jedoch langsamer, ob sie vorhanden sind.

  • Skalierbarkeit: Wenn Ihre Daten wachsen, funktioniert Set.has() weiterhin gut, während Array.includes() langsamer wird.

Letzte Gedanken

Es ist immer wichtig, die Größe und Art Ihres Datensatzes zu kennen, wenn Sie zwischen Set.has() und Array.includes() wählen. Array.includes() ist für kleine Datensätze vollkommen in Ordnung, aber Set.has() ist ein wertvolles Werkzeug in Situationen, in denen Geschwindigkeit entscheidend ist. Die richtige Datenstruktur kann dazu beitragen, Ihre JavaScript-Anwendungen schneller und effizienter zu optimieren, ohne große Änderungen an Ihrem Code vorzunehmen.

Wenn Sie also prüfen, ob etwas vorhanden ist, sollten Sie sich fragen: Ist das eine Aufgabe für ein Array oder kann ich die Leistung eines Sets nutzen? Es könnte durchaus der Unterschied sein, den Ihre Anwendung braucht, wenn Sie es richtig machen.

Das obige ist der detaillierte Inhalt vonWarum Set.has() beim Suchen von Elementen schneller ist als Array.includes(). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn