Suboptimal (O(D^2)) memory usage
Mantenedores costumam responder em até 1 dia
Ninguém assumiu esta issue ainda.
Avaliação
- Dificuldade
- 5/5
- Tempo estimado
- Mais de uma semana
- Facilidade para iniciantes
- 25/100
- Tipo de issue
- Bug
- Clareza
- Razoavelmente clara
- Status de atividade
- Estagnada
- Stack de tecnologia
- javascript
- Domínio
- performance
Direção de pesquisa
Comece com src/diff/base.js e compare o armazenamento de caminhos e componentes usado por ele com o refinamento de espaço linear descrito no artigo de Myers e na implementação vinculada do diff-match-patch. Reproduza o problema com os comandos JSON fornecidos do Hearthstone e a.js; considera-se concluído quando o diff for concluído sem o uso excessivo de memória e a lentidão da coleta de lixo relatados.
Escrita pelo modelo de indexação a partir do texto da issue.
Descrição
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).
- Linguagem predominante
- JavaScript
- Estrelas
- 9.2k
- Forks
- 555
- Merge médio
- 1d 9h
- PRs com merge (30d)
- 5
Preparar o ambiente
- Sem Dockerfile nem arquivo Docker Compose
- Sem modelo de pull request
- Ler o guia de contribuição
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de kpdecker/jsdiff
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 76/100
Mantenedores costumam responder em até 1 dia
-
Migrating to ESM onlyAberta
Dificuldade 5/5 Mais de uma semana Facilidade para iniciantes 35/100
kpdecker/jsdiff#703 · 1 reação ·
Mantenedores costumam responder em até 1 dia
-
Applying a patch with a fuzzFactor can be very very slowTalvez já em andamento @json-open-source assumiu há 40 dias. Abertaperformance
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 48/100
kpdecker/jsdiff#692 · 2 comentários ·
Mantenedores costumam responder em até 1 dia
-
Dificuldade 1/5 Menos de uma hora Facilidade para iniciantes 45/100
kpdecker/jsdiff#684 · 1 comentário ·
Mantenedores costumam responder em até 1 dia
-
reversing a text diff?Aberta
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 35/100
kpdecker/jsdiff#629 · 7 comentários ·
Mantenedores costumam responder em até 1 dia
Todas as issues de kpdecker/jsdiff
Issues semelhantes
-
bug
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 68/100
home-sweet-gnome/dash-to-panel#2594 ·
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 84/100
agentic-community/mcp-gateway-registry#2017 ·
Mantenedores costumam responder em até 1 dia
-
P2 Team S Type: Bug
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 78/100
google/site-kit-wp#14138 ·
Mantenedores costumam responder em até 2 dias
-
0. Needs triage bug
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 76/100
Mantenedores costumam responder em até 1 dia
-
from-agent
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 65/100