Conocimiento común sobre el rendimiento de haskell [cerrado]
Hola Haskellers por ahí!
Tengo la sensación de que las preguntas sobre el rendimiento surgen con mayor frecuencia y que el conocimiento sobre qué funciones / algoritmos / bibliotecas son rápidos y estables es escaso.
Por supuesto hay bibliotecas comoCriterion
que permiten realizar mediciones por cuenta propia, y existe un perfilador que puede ser invocado por
> ghc -O2 --make program.hs -prof -auto-all
> ./program +RTS -s
como lo explica excelentemente @DonStewart enHerramientas para analizar el rendimiento de un programa Haskell.
Yo sé eso:
el uso deread
yshow
suele ser un cuello de botella (para laread
-función en el caso de números hay laNumeric
paquete que trae un rendimiento de aceleracióny ahí están losSequence
, Array
, Vector
yMap
bibliotecas, que a menudo son más adecuadas para resolver un problema que usar listas o listas anidadasText
yBytestring
son una mejor opcion que StringHace poco vi que incluso el uso del generador de números estándar ralentiza significativamente un programa y quemwc-random
Es mucho más rápido.También las respuestas dePython más rápido que Haskell compilado? reveló que el algoritmo de clasificación estándar es definitivamente mejorableEl uso deInt
más bien queInteger
, BangPatterns
y los pliegues estrictos a menudo producen un aumento en el rendimientoExistenconduit
ypipes
para "restringir" la IO (que debo admitir que todavía no he usado)Las firmas tipo son una mejora general.¿Cuáles son otras dificultades y cuellos de botella comunes que uno tiende a usar?
¿Cómo resolverlos?
Los temas que me vienen a la mente son:
funcionesestructuras de datosalgoritmosExtensiones de idioma (para GHC)?opciones del compilador?