shrink: share one seen map in unnamedStructs
Los mantenedores suelen responder en 1 día
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 1/5
- Tiempo estimado
- Menos de una hora
- Aptitud para principiantes
- 86/100
- Tipo de issue
- Refactorización
- Claridad
- Bien especificado
- Estado de actividad
- Activo
- Stack tecnológico
- go
- Área
- performance, tooling
Línea de trabajo
Comienza en internal/shrink/evidence.go, en unnamedStructs alrededor de la línea 306, y lee evidenceCollectUnnamed para entender cómo seen evita los recorridos recursivos. Mueve el mapa seen al ámbito de nivel de ejecución mostrado en el issue y verifica después que unnamed permanezca sin cambios, mientras que los tipos compartidos se recorren una sola vez.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
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.
- Lenguaje dominante
- Go
- Estrellas
- 42
- Forks
- 1
- Merge medio
- 1 h 20 min
- PR fusionados (30 d)
- 100
Preparar el entorno
Este proyecto no incluye contenedor de desarrollo, Dockerfile ni guía de contribución, así que la configuración corre por tu cuenta: empieza por su README y consulta nuestra guía para la primera contribución para los pasos generales.
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Issues similares
-
test(fabric): load the TestLoad fixture through config.Service instead of a raw koanf decodeAbiertocleanup hacktoberfest priority: low skill: good first issue testing
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
hyperledger-labs/fabric-smart-client#2197 ·
Los mantenedores suelen responder en 1 día
-
NTR: [tRNA kinase activity]AbiertoNew term request
Dificultad 2/5 1-3 horas Aptitud para principiantes 62/100
geneontology/go-ontology#32791 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 69/100
aws/amazon-ecs-agent#5177 ·
Los mantenedores suelen responder en 2 días
-
release-followup
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
Los mantenedores suelen responder en 1 día
-
kind/bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
Los mantenedores suelen responder en 1 día