Suboptimal (O(D^2)) memory usage
I maintainer di solito rispondono entro 1 giorno
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 5/5
- Tempo stimato
- Più di una settimana
- Idoneità per principianti
- 25/100
- Tipo di issue
- Bug
- Chiarezza
- Abbastanza chiara
- Stato di attività
- Ferma
- Stack tecnologico
- javascript
- Ambito
- performance
Direzione di ricerca
Inizia da src/diff/base.js e confronta la sua memorizzazione di percorsi e componenti con il perfezionamento a spazio lineare descritto nell’articolo di Myers e nell’implementazione collegata di diff-match-patch. Riproduci il problema con i comandi JSON di Hearthstone forniti e a.js; il lavoro è completato quando il diff termina senza l’uso eccessivo di memoria e il rallentamento della garbage collection segnalati.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
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).
- Lingua principale
- JavaScript
- Stelle
- 9.2k
- Fork
- 555
- Merge medio
- 1g 9h
- PR unite (30g)
- 5
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Nessun modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di kpdecker/jsdiff
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
I maintainer di solito rispondono entro 1 giorno
-
Migrating to ESM onlyAperta
Difficoltà 5/5 Più di una settimana Idoneità per principianti 35/100
kpdecker/jsdiff#703 · 1 reazione ·
I maintainer di solito rispondono entro 1 giorno
-
Applying a patch with a fuzzFactor can be very very slowForse già presa @json-open-source l’ha presa 39 giorni fa. Apertaperformance
Difficoltà 4/5 3-5 giorni Idoneità per principianti 48/100
kpdecker/jsdiff#692 · 2 commenti ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 45/100
kpdecker/jsdiff#684 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
reversing a text diff?Aperta
Difficoltà 4/5 3-5 giorni Idoneità per principianti 35/100
kpdecker/jsdiff#629 · 7 commenti ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di kpdecker/jsdiff
Issue simili
-
Edit: Monumental TV [PY]Apertachannels:edit check:passed
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 75/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 94/100
lidofinance/docs#1033 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
I maintainer di solito rispondono entro 1 giorno