Après l'écriture de cet article j'ai décidé de mettre mon argent là où ma bouche et a commencé à convertir un précédent projet de la mine d'utilisation recursion-schemes
.
La structure de données en question est un paresseux kdtree. Jetez un oeil à des mises en oeuvre avec explicite et implicite de la récursivité.
C'est surtout une simple conversion, le long des lignes de:
data KDTree v a = Node a (Node v a) (Node v a) | Leaf v a
pour
data KDTreeF v a f = NodeF a f f | Leaf v a
Maintenant, après évaluation tout le toutim, je trouve que l' KDTreeF
version est environ deux fois plus lent que la normale version (trouver l'ensemble de la course ici).
C'est juste de la supplémentaire Fix
wrapper qui ralentit moi ici-bas? Et est-ce que je pouvais faire contre cela?
Mises en garde:
- Pour le moment ce n'est spécialisé (V3 Double).
- C'est cata - après anamorphism application. Hylomorphism n'est pas adapté pour kdtrees.
- J'utilise
cata (fmap foo algebra)
plusieurs fois. Est-ce une bonne pratique? - J'utilise Edwards
recursion-schemes
package.
Edit 1:
Est-ce lié? https://ghc.haskell.org/trac/ghc/wiki/NewtypeWrappers
Est - newtype Fix f = Fix (f (Fix f))
est pas "libre"?
Edit 2:
Juste un autre tas de repères. Cette fois, j'ai testé la construction de l'arbre et de la déconstruction. Référence ici: https://dl.dropboxusercontent.com/u/2359191/2014-05-15-kdtree-bench-03.html
Alors que le centre de sortie indique que les structures de données ne sont pas complètement supprimé et il n'est pas surprenant que le linéaire des recherches dominent maintenant, l' KDTreeF
s sont maintenant légèrement plus rapide que l' KDTree
s. N'a pas d'importance très bien.