En programmation fonctionnelle, étant donné que presque toutes les structures de données sont immuables, lorsque l’état doit changer, une nouvelle structure est créée. Est-ce que cela signifie beaucoup plus d'utilisation de la mémoire?
Cela dépend de la structure des données, des modifications exactes effectuées et, dans certains cas, de l'optimiseur. A titre d'exemple, considérons l'ajout au début d'une liste:
list2 = prepend(42, list1) // list2 is now a list that contains 42 followed
// by the elements of list1. list1 is unchanged
Ici, les besoins en mémoire supplémentaires sont constants, de même que le coût d’appel à l’exécution prepend
. Pourquoi? Parce prepend
que crée simplement une nouvelle cellule qui a 42
pour tête et list1
pour queue. Pour ce faire, il n'est pas nécessaire de copier ou d'itérer autrement list2
. Autrement dit, à l'exception de la mémoire requise pour le stockage 42
, list2
réutilise la même mémoire que celle utilisée par list1
. Les deux listes étant immuables, ce partage est parfaitement sécurisé.
De même, lorsque vous travaillez avec des structures arborescentes équilibrées, la plupart des opérations ne nécessitent qu'une quantité logarithmique d'espace supplémentaire car tout, à l'exception d'un seul chemin, peut être partagé.
Pour les tableaux, la situation est un peu différente. C'est pourquoi, dans de nombreuses langues de PF, les tableaux ne sont pas utilisés couramment. Cependant, si vous faites quelque chose comme arr2 = map(f, arr1)
et que vous arr1
ne l'utilisez plus après cette ligne, un optimiseur intelligent peut en réalité créer du code qui mute arr1
au lieu de créer un nouveau tableau (sans affecter le comportement du programme). Dans ce cas, la performance sera comme dans une langue impérative bien sûr.