2010-11-17 29 views
1

J'ai une fonction Scheme qui est sous forme de base ressemble à ceComment puis-je savoir si mon bon fonctionnement du système récursive est optimisé correctement

(define (foo param var) 
    (cond ((end-condition) (return-something)) 
     ((other-end-condit) (return-something-else)) 
     (else 
     (let ((newvar (if some-condition 
          (make-some-updated var) 
          (destructive-update! var)))) 
      (foo param newvar))))) 

Je me sens comme cela est assez clairement quelque chose qui doit être optimisé pour itération dans la compilation, mais quand je le compile (avec du poulet) ça marche toujours incroyablement lentement. (Si je comprends les spécifications R5RS: http://groups.csail.mit.edu/mac/ftpdir/scheme-reports/r5rs-html.old/r5rs_22.html, cela semble fonctionner)

J'ai écrit le même algorithme exact avec une boucle while en python et le programme interprété s'est terminé en secondes. Mon schéma compilé prend environ 15 minutes, et je suis certain que l'algorithme est le même.

Je pense que c'est une récursion de queue ne pas obtenir le problème optimisé, car je ne peux pas penser à quoi d'autre il pourrait éventuellement être, mais je ne peux pas le comprendre. Des idées? Pour ce que cela vaut, le var est un hachage et la mise à jour destructive est simplement en ajoutant un élément, bien qu'il renvoie également le hachage mis à jour à passer en tant que newvar.

+0

Il se peut qu'une autre partie de votre code ait une lenteur cachée, mais j'essaierais aussi différentes implémentations de Scheme: Gambit et Bigloo sont deux compilateurs qui valent la peine d'être essayés. – erjiang

+0

Je peux juste le faire, merci –

Répondre

4

Cette fonction est en effet récursive, donc vous y êtes bien. Cependant, la récursivité de la queue signifie simplement que l'espace de la pile ne va pas augmenter, pas que votre programme est garanti pour fonctionner rapidement. Si vous voulez voir si votre programme fonctionne réellement de manière récursive, exécutez-le tout en surveillant la mémoire totale prise par Chicken (et assurez-vous de ne pas allouer de mémoire dans make-some-updated, ce que vous pourriez être). Si la mémoire augmente, Chicken ne compile pas correctement votre programme selon la norme.

+3

Une autre chose à essayer est DrRacket - vous pouvez entrer le code et appuyer sur le bouton "vérifier la syntaxe" - puis planer sur les expressions montrera des flèches roses qui indiquent les positions de la queue. –

+0

Ah. Je pensais que le choix de l'appel de la queue a donné un coup de pouce de la vitesse en plus d'économiser l'espace de la pile. Merci pour la clarification. Maintenant, je dois juste savoir où va ma vitesse? –