shrink: share one seen map in unnamedStructs
I maintainer di solito rispondono entro 1 giorno
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 1/5
- Tempo stimato
- Meno di un'ora
- Idoneità per principianti
- 86/100
- Tipo di issue
- Refactoring
- Chiarezza
- Specificata chiaramente
- Stato di attività
- Attiva
- Stack tecnologico
- go
- Ambito
- performance, tooling
Direzione di ricerca
Inizia in internal/shrink/evidence.go, in unnamedStructs intorno alla riga 306, e leggi evidenceCollectUnnamed per capire come seen impedisce le visite ricorsive. Sposta la mappa seen nell’ambito a livello di esecuzione mostrato nell’issue, quindi verifica che unnamed rimanga invariato mentre i tipi condivisi vengano attraversati una sola volta.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Summary
unnamedStructs (internal/shrink/evidence.go:306) starts a fresh seen map for every entry in TypesInfo.Types. The same types are walked again for every expression that has them. One shared seen map per run walks each type once.
Current shape
for expr, tv := range p.TypesInfo.Types {
if !defining[expr] {
evidenceCollectUnnamed(tv.Type, &unnamed, map[types.Type]bool{}) // new map per expression
}
}
func evidenceCollectUnnamed(t types.Type, into *typeutil.Map, seen map[types.Type]bool) {
if t == nil || seen[t] {
return
}
seen[t] = true
switch t := types.Unalias(t).(type) {
case *types.Signature:
evidenceCollectUnnamed(t.Params(), into, seen) // walks into every parameter
evidenceCollectUnnamed(t.Results(), into, seen)
...
}
}
Why the change helps
TypesInfo.Types has one entry per expression. Many expressions share one type object:
- Every call to one function has the same
*types.Signature, and that signature is walked again for each call. - Every mention of a
map[string][]*Itemwalks the map, the slice and the pointer again.
seen is only there to stop recursion. The results go into unnamed, a typeutil.Map, which already removes duplicates. So a type that is already in seen has already put all its unnamed structs into unnamed. Walking it again adds nothing.
seen := map[types.Type]bool{} // one per run
for _, p := range m.Widest() {
...
for expr, tv := range p.TypesInfo.Types {
if !defining[expr] {
evidenceCollectUnnamed(tv.Type, &unnamed, seen)
}
}
}
The cost goes from the sum of type sizes over all expressions down to the sum over distinct types.
Risk
None. seen only prunes recursion, and the output set is the same.
Not measured yet. A trivial change.
- Lingua principale
- Go
- Stelle
- 42
- Fork
- 1
- Merge medio
- 1h 20m
- PR unite (30g)
- 100
Preparare l'ambiente
Questo progetto non fornisce container di sviluppo, Dockerfile né guida per i contributori, quindi l'ambiente è a tuo carico: parti dal suo README e consulta la nostra guida al primo contributo per i passaggi generali.
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.
Issue simili
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 74/100
scaleway/scaleway-cli#6492 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 67/100
taskcluster/taskcluster#9284 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 66/100
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
oasdiff/oasdiff#1337 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
splunk/terraform-provider-splunk#256 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno