performance - Depuración de problemas de rendimiento en el tiempo de compilación causados por el solucionador de restricciones de GHC
debugging haskell (1)
Para lo que vale, puede evaluar las restricciones de una en una utilizando: kind! para ver cuánto tiempo lleva, en lugar de tener que comentarlos individualmente.
Haskell tiene muchas herramientas excelentes para depurar problemas de rendimiento en tiempo de ejecución, pero ¿qué herramientas / reglas generales existen para depurar problemas de rendimiento en tiempo de compilación ?
Específicamente, el solucionador de restricciones en algunos de mis códigos se está demorando para siempre (entre 1 y 2 segundos a varios minutos). Estoy bastante seguro de que esto se debe a la forma en que estoy utilizando familias de tipos en las restricciones, pero no tengo idea de qué tipo de cosas son caras en este contexto o de cómo ver dónde el solucionador de restricciones está gastando su tiempo. Mi mejor conjetura es que una de mis operaciones en listas de tipos está tomando tiempo cuadrático en lugar de lineal.
Veamos un ejemplo de por qué sospecho que el solucionador de restricciones. En mis archivos, tengo un código que se parece a:
class ExampleClass a where
type ExampleType a
f :: ExampleType a -> a
data ExampleData (xs :: [a]) = ...
instance
( Constraint1
, Constraint2
, ...
) => ExampleClass (ExampleData xs)
where
type ExampleType (ExampleData xs) = Int
f = undefined
Cuando cargue este archivo en ghci
ghci> :l Example.hs
La compilación sucede muy rápidamente, mucho menos que 1 segundo. Luego, ejecuto la siguiente línea:
ghci> let test = f Int :: ExampleData
No se está realizando ningún cálculo real, pero esto todavía lleva mucho tiempo. ExampleData
más restricciones haya en la declaración de instancia de ExampleData
, más tiempo llevará. (En realidad, la evaluación de la prueba se realiza de manera instantánea). La mejor manera de descubrir cómo depurar estos problemas de rendimiento es comentando las restricciones una por una y viendo cuáles están causando el impacto en el rendimiento. Pero esto requiere mucho tiempo, y cuando esas restricciones involucran familias de tipo complejo, no es realmente tan informativo.
Entonces, ¿hay un mejor enfoque que pueda tomar para depurar este problema?
Edit: Resulta que descubrí un error en GHC . Hay un script asociado con el error que demuestra que el solucionador de restricciones está tomando tiempo cuadrático en las entradas que deberían ser lineales.