On m'a dit dans des questions précédentes que les langages de programmation fonctionnels ne conviennent pas aux systèmes dynamiques tels qu'un moteur physique, principalement parce qu'il est coûteux de muter des objets. Dans quelle mesure cette affirmation est-elle réaliste et pourquoi?
functional-programming
haskell
clojure
immutability
MaiaVictor
la source
la source
Due to the functional programming style the computational load will be distributed over the available CPU cores which can dramatically increase processing speed in some cases
Réponses:
Haskell et Clojure permettent une mutabilité réelle, donc ce n'est pas un problème pour commencer.
Au-delà de cela, si vos données "mutables" consistent en des valeurs intermédiaires mises à jour de manière incrémentielle dans le cadre d'un calcul plus important, vous n'aurez peut-être même pas besoin de mutabilité pour être efficace! Par exemple, des recherches sont en cours à Haskell concernant une technique appelée fusion de flux , où le compilateur fusionne les boucles de traitement, les producteurs de données et les consommateurs de données pour éliminer complètement les structures de données intermédiaires.
Le problème principal avec Haskell ici est la paresse - dans un programme de calcul de nombres où vous avez beaucoup de données d'entrée et beaucoup de données de sortie et tout cela est important, la paresse vous fait très peu de faveurs mais impose toujours des frais généraux. Cela ne veut pas dire que vous ne pouvez pas écrire des programmes comme celui-ci à Haskell (les gens le font en fait), mais cela ne joue pas sur les points forts du langage et vous devez avoir une meilleure compréhension du modèle d'évaluation pour obtenir les performances souhaitées.
Cela dit, la forte compression des nombres ne joue pas non plus sur les atouts de la JVM. Ce genre de programme explique pourquoi FORTRAN est toujours là.
la source
Je ne peux pas parler pour Clojure, mais je peux dire que Haskell a beaucoup de packages IO très hautement disponibles qui permettront toutes les mutations que vous pourriez souhaiter.
Voici une réponse à une question que j'ai écrite où quelqu'un détaille les 3 plus courantes et concerne leurs performances: /programming/15439966/when-why-use-an-mvar-over-a-tvar/15440286 # 15440286
Vous pouvez également voir ici un graphique simple montrant les mesures de performances d'un serveur Web haskell appelé Warp, qui est une application très intensive en E / S.
Il y a beaucoup de confusion à ce sujet en ce qui concerne Haskell, la vérité est qu'il a de fantastiques installations d'E / S avec de nombreux packages sur le piratage pour utiliser les E / S de nombreuses façons différentes, dont beaucoup ont été hautement réglées. La raison pour laquelle les gens pensent que ce n'est pas le cas est que Haskell fait de grands efforts pour séparer les E / S de tout le reste, mais cela n'a aucun effet sur les caractéristiques de performance.
Maintenant, pour parler des caractéristiques de performance, la raison pour laquelle les gens la reconnaissent comme ayant de mauvaises performances est due à l'évaluation paresseuse qui la fait se comporter de manière pas toujours intuitive. C'est toutefois quelque chose dont vous devez vous préoccuper beaucoup moins lorsque vous commencez à travailler dans un contexte d'E / S à effectuer des mises à jour destructrices, comme dans un système auquel vous faites référence. De plus, les gens ont tendance à constater que lorsqu'ils ont des problèmes de performances, les installations intégrées pour instrumenter et identifier où les ressources vont aider beaucoup.
Une autre monade qui mérite d'être étudiée pour un système comme vous le décrivez serait la monade ST qui est spécifiquement destinée aux mises à jour destructrices effectuées par de très petits appels d'E / S, ce qui lui confère d'excellentes performances.
Désolé, je ne peux vraiment pas parler à Clojure, j'espère que quelqu'un d'autre peut donner des détails là-bas.
la source