Suboptimal (O(D^2)) memory usage
Maintainer antworten meist innerhalb von 1 Tag
Dieses Issue hat noch niemand übernommen.
Bewertung
- Schwierigkeit
- 5/5
- Geschätzter Aufwand
- Über eine Woche
- Anfängerfreundlichkeit
- 25/100
- Issue-Typ
- Bug
- Klarheit
- Größtenteils klar
- Aktivitätsstatus
- Veraltet
- Tech-Stack
- javascript
- Bereich
- performance
Rechercherichtung
Beginne mit src/diff/base.js und vergleiche die dortige Speicherung von Pfaden und Komponenten mit der in Myers' Arbeit beschriebenen Linear-Space-Verfeinerung und der verknüpften diff-match-patch-Implementierung. Reproduziere das Problem mit den bereitgestellten Hearthstone-JSON-Befehlen und a.js; abgeschlossen ist die Aufgabe, wenn der Diff ohne die gemeldete übermäßige Speichernutzung und Verlangsamung durch die Garbage Collection abgeschlossen wird.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Beschreibung
It seems https://github.com/kpdecker/jsdiff/blob/3b654c2ed7d5262ed9946de841ad8dae990286c7/src/diff/base.js does not implement "4b. A Linear Space Refinement" mentioned in Myers' paper. So the memory usage is O(D^2). From the code it looks like O(len(bestPath) * len(components in bestPath)) might be that complexity.
This makes it practically too slow to complete diff calculation if there are many changes. For example, comparing the prettified Hearthstone cards.json in different languages wouldn't complete in 20 minutes using jsdiff:
Reproduce:
# Prepare test data
wget https://api.hearthstonejson.com/v1/168129/enUS/cards.json -O 1
wget https://api.hearthstonejson.com/v1/168129/zhCN/cards.json -O 2
python3 -m json.tool < 1 > a
python3 -m json.tool < 2 > b
// a.js - Calculate diff
const fs = require('fs')
const diff = require('diff');
const a = fs.readFileSync('a', {encoding: 'utf-8'});
const b = fs.readFileSync('b', {encoding: 'utf-8'});
console.log(`pid: ${process.pid}`);
console.log(diff.diffLines(a, b).length);
Profiler shows that nodejs spent 70% time on GC:

As a comparison, it seems diff-match-patch implements the linear space refinement and can completes the above test case in ~24s. (For reference, git diff --stat --minimal completes in ~0.3s).
- Vorherrschende Sprache
- JavaScript
- Sterne
- 9.2k
- Forks
- 555
- Ø Merge
- 1 T. 9 Std.
- Gemergte PRs (30 T.)
- 5
Entwicklungsumgebung
- Kein Dockerfile und keine Docker-Compose-Datei
- Keine Pull-Request-Vorlage
- Beitragsleitfaden lesen
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus kpdecker/jsdiff
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 76/100
Maintainer antworten meist innerhalb von 1 Tag
-
Migrating to ESM onlyOffen
Schwierigkeit 5/5 Über eine Woche Anfängerfreundlichkeit 35/100
kpdecker/jsdiff#703 · 1 Reaktion ·
Maintainer antworten meist innerhalb von 1 Tag
-
Applying a patch with a fuzzFactor can be very very slowEvtl. vergeben @json-open-source hat das vor 39 Tagen übernommen. Offenperformance
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 48/100
kpdecker/jsdiff#692 · 2 Kommentare ·
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 1/5 Unter einer Stunde Anfängerfreundlichkeit 45/100
kpdecker/jsdiff#684 · 1 Kommentar ·
Maintainer antworten meist innerhalb von 1 Tag
-
reversing a text diff?Offen
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 35/100
kpdecker/jsdiff#629 · 7 Kommentare ·
Maintainer antworten meist innerhalb von 1 Tag
Alle Issues in kpdecker/jsdiff
Ähnliche Issues
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 66/100
-
Schwierigkeit 1/5 Unter einer Stunde Anfängerfreundlichkeit 88/100
openlayers/create-ol-app#70 ·
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 72/100
-
enhancement
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 78/100
VoteIT/voteit_frontend#446 ·
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 78/100
simstudioai/sim#9831 ·
Maintainer antworten meist innerhalb von 1 Tag