performance - funtor - ¿Por qué las funciones hacen de Vector una instancia de Functor, Mónada, Aplicativo, Alternativo, Plegable y Transversal lento?
haskell (2)
El registro de cambios para la versión 0.8 de vector muestra el siguiente cambio con una advertencia:
Instancias de Functor, Mónada, Aplicativo, Alternativo, Plegable y Transversal para vectores en caja (ADVERTENCIA: tienden a ser lentas y solo se proporcionan para completarlas) .
¿Podría alguien explicar por qué este es el caso? ¿Es solo el costo normal de la especialización de clase de tipos, o algo más interesante?
Actualización: Al observar algunas instancias particulares, se ve, por ejemplo:
instance Foldable.Foldable Vector where
{-# INLINE foldr #-}
foldr = foldr
Y lo mismo para los otros pliegues. ¿Significa esto que el plegado es lento para Vector
s en general? Si no, ¿qué hace que un pliegue no especializado sea lo suficientemente lento como para justificar una advertencia?
Acabo de echar un vistazo rápido al código fuente y las implementaciones no parecen excesivamente lentas. Argumentaría que los autores agregaron esta advertencia porque cuando estás escribiendo un programa en la mónada Vector
, estás trabajando desde un punto de vista tan alto que es fácil olvidar que cada >>=
es, de hecho, un concatMap
, que tiende a ser inherentemente lento.
Otra cosa: Vector
es particularmente rápido para los tipos sin caja. Así que un usuario podría sentirse atraído por el uso de la notación de mónada (por conveniencia), mientras que en realidad debería usar un tipo sin caja (para velocidad).
Envié el conjunto original de estas instancias a Roman hace un año y medio y he mantenido instancias vectoriales desde entonces. (Tuve que eliminar estas instancias de instancias vectoriales una vez que migraron a vector, y ahora lo mantengo únicamente para las cosas realmente exóticas). Su preocupación era que si la gente usaba estos casos de forma polimórfica, entonces las REGLAS que hacen que los vectores se fundan, no se pueden disparar, a menos que la función polimórfica esté en línea y monomorfizada.
Existen porque no todos los bits de código del planeta son específicos de Vector, e incluso entonces es bueno usar los nombres comunes a veces.
Lento aquí es relativo. El peor de los casos es que se desempeñan como los pliegues, ataduras, etc. de otros, pero Roman toma cada valor en caja como un insulto personal. :)