2017-10-07 1 views
0

Je suis nouveau à clojure et je viens d'apprendre et d'expérimenter avec la fonction de mémorisation. Il me semble que l'existence de cette fonction est étrange.Pourquoi avons-nous la fonction de memoize de clojure?

D'abord les fonctions avec effets secondaires se terminent par!

En second lieu à l'aide de mémoriser est très simple

Pourquoi ne Clojure pas fait tout ça pour moi? Il y a un équilibre entre l'utilisation de la mémoire et les performances, mais vous pourriez facilement obtenir le temps d'exécution de clojure pour avoir un morceau de RAM alloué aux résultats de la fonction. Si une fonction est appelée avec les mêmes arguments, elle utilise plusieurs fois les résultats mis en cache, si la mémoire est épuisée, efface le cache et conserve la trace des caches de cache si fréquemment rappelés que les fonctions sont moins susceptibles d'être supprimées du cache. Si je conçois cela, je définirais même un niveau de performance minimum pour les fonctions de sorte que si un appel de fonction est plus rapide que la récupération du cache, il n'est pas mis en cache. (Ou faire de cette propriété de la façon dont toutes les fonctions appelle le travail.)

Quelqu'un peut-il expliquer pourquoi clojure ne le fait pas

Merci

+1

Si vous pouvez ajouter cette capacité au compilateur, vous enchanterez la communauté Clojure. Rappelez-vous que Clojure (contrairement à - disons - Haskell) ne force pas les fonctions à être pures. – Thumbnail

+3

Je ne pense pas que quiconque serait enchanté par cela. Il y a beaucoup de problèmes avec ça. Vous remplissiez la mémoire presque instantanément, par exemple, en mettant en cache un tas de déchets inutiles dont personne ne se soucie, ne laissant aucune place pour mettre en cache la ou les choses utiles. De plus, vous ajouteriez une surcharge substantielle à chaque appel de fonction pour effectuer la mise en cache, et pour mesurer le "niveau de performance minimum" pour décider si une chose vaut la mise en cache. La performance deviendrait beaucoup plus difficile à raisonner, car l'exécution de chaque fonction devient non-déterministe. Les fonctions marginales s'exécutent "si cela en a l'air". – amalloy

Répondre

4

Il y a une vieille blague dans la science informatique qu'il n'y a que deux problèmes difficiles:

  1. cache
  2. invalidation
  3. choses de nommage

La fonction intégrée memoize est un bon début à ce qu'elle fait, et elle est utile et suffisante dans quelques cas. Il s'adapte bien à cette blague. C'est un nom un peu gênant (opinion ici) et il échoue très mal à l'invalidation du cache. Il suppose que si une fonction a déjà été appelée, le résultat sera toujours pertinent, et que la fonction est pure, et ne rencontre pas d'erreurs, et que tous les appels sont également pertinents pour tous les temps. Le monde réel est plein de nuances qui se révèlent être très important pour la mise en cache:

  1. de valeurs de retour ne sont pas utiles pour toujours
  2. de nombreuses fonctions sont sans bornes portée (mathématiques par exemple)
  3. de nombreuses fonctions sont plus rapide que le cache (mathématiques à nouveau)
  4. Les fonctions ont des arguments équivalents. Ceux-ci devraient être dans la même classe.
  5. memoize ne peut garantir qu'une seule fonction sera exécutée.
  6. de nombreuses fonctions ne seront jamais pures (comme accepter une connexion réseau)
  7. certains arguments n'affectent pas la valeur de retour.

Toutes ces choses entrent en ligne de compte lors de la conception de la mise en cache pour les applications Web par exemple. # 5 est un cas intéressant, considérez ce qui se passe si vous memoize une fonction très lente, et il y a deux appels à une seconde d'intervalle. Quelle valeur de retour devient le résultat mémorisé? Dans quels cas est-ce important? Ces détails peuvent vraiment importer, surtout si l'un d'eux rencontre une circonstance inhabituelle.Au cours des huit dernières années, j'ai travaillé plusieurs fois avec la production, et il a toujours été remplacé rapidement par un appel à l'une des fonctions en clojure.core.cache une fois que les problèmes inévitables surviennent.

Si vous vous trouvez vouloir memoizeil y a une bonne chance que vous serez plus heureux avec core.cache. Il offre de nombreuses options plus nuancées pour s'adapter à plus de cas réels.