Caractéristiques d'Erlang
De Erlang Programming (2009):
La concurrence Erlang est rapide et évolutive. Ses processus sont légers en ce que la machine virtuelle Erlang ne crée pas de thread de système d'exploitation pour chaque processus créé. Ils sont créés, planifiés et gérés dans la machine virtuelle, indépendamment du système d'exploitation sous-jacent. En conséquence, le temps de création du processus est de l'ordre de la microseconde et indépendant du nombre de processus existants simultanément. Comparez cela avec Java et C #, où pour chaque processus un thread de système d'exploitation sous-jacent est créé: vous obtiendrez des comparaisons très compétitives, avec Erlang surpassant largement les deux langages.
De la programmation orientée concurrence dans Erlang (pdf) (diapositives) (2003):
Nous observons que le temps nécessaire pour créer un processus Erlang est constant de 1µs jusqu'à 2500 processus; ensuite, il augmente jusqu'à environ 3µs pour jusqu'à 30 000 processus. Les performances de Java et C # sont indiquées en haut de la figure. Pour un petit nombre de processus, il faut environ 300 µs pour créer un processus. Créer plus de deux mille processus est impossible.
Nous voyons que pour jusqu'à 30 000 processus, le temps d'envoi d'un message entre deux processus Erlang est d'environ 0,8 µs. Pour C #, cela prend environ 50µs par message, jusqu'au nombre maximum de processus (qui était d'environ 1800 processus). Java était encore pire, pour jusqu'à 100 processus, il fallait environ 50 µs par message, puis il augmentait rapidement à 10 ms par message alors qu'il y avait environ 1000 processus Java.
Mes pensées
Je ne comprends pas parfaitement pourquoi les processus Erlang sont tellement plus efficaces pour générer de nouveaux processus et ont une empreinte mémoire beaucoup plus petite par processus. Le système d'exploitation et la machine virtuelle Erlang doivent faire la planification, les changements de contexte et garder une trace des valeurs dans les registres, etc.
Pourquoi les threads du système d'exploitation ne sont-ils pas implémentés de la même manière que les processus d'Erlang? Doivent-ils soutenir quelque chose de plus? Et pourquoi ont-ils besoin d'une plus grande empreinte mémoire? Et pourquoi ont-ils une reproduction et une communication plus lentes?
Techniquement, pourquoi les processus d'Erlang sont-ils plus efficaces que les threads du système d'exploitation en ce qui concerne le frai et la communication? Et pourquoi les threads du système d'exploitation ne peuvent-ils pas être implémentés et gérés de la même manière efficace? Et pourquoi les threads du système d'exploitation ont-ils une plus grande empreinte mémoire, ainsi qu'une génération et une communication plus lentes?
Plus de lecture
erl +P 1000100 +hms 100
et tapez ensuite {_, PIDs} = timer:tc(lists,map,[fun(_)->spawn(fun()->receive stop -> ok end end) end, lists:seq(1,1000000)]).
et attendez environ trois minutes pour obtenir le résultat. C'est si simple. Il faut 140us par processus et 1 Go de RAM entière sur mon ordinateur portable. Mais c'est directement sous forme de shell, ça devrait être mieux à partir du code compilé.