Características de Erlang
Da Programação Erlang (2009):
A simultaneidade de Erlang é rápida e escalável. Seus processos são leves, pois a máquina virtual Erlang não cria um encadeamento do SO para cada processo criado. Eles são criados, agendados e manipulados na VM, independentemente do sistema operacional subjacente. Como resultado, o tempo de criação do processo é da ordem de microssegundos e independente do número de processos existentes simultaneamente. Compare isso com Java e C #, onde para cada processo é criado um encadeamento do SO subjacente: você obterá comparações muito competitivas, com o Erlang superando muito as duas linguagens.
Da programação orientada à concorrência em Erlang (pdf) (slides) (2003):
Observamos que o tempo necessário para criar um processo Erlang é constante de 1µs a 2.500 processos; depois disso, aumenta para cerca de 3 µs para até 30.000 processos. O desempenho do Java e C # é mostrado na parte superior da figura. Para um pequeno número de processos, são necessários cerca de 300 µs para criar um processo. Criar mais de dois mil processos é impossível.
Vemos que, para até 30.000 processos, o tempo para enviar uma mensagem entre dois processos Erlang é de cerca de 0,8µs. Para C #, são necessários cerca de 50 µs por mensagem, até o número máximo de processos (que eram cerca de 1800 processos). O Java foi ainda pior: para até 100 processos, foram necessários cerca de 50µs por mensagem; depois, aumentou rapidamente para 10ms por mensagem, quando havia cerca de 1000 processos Java.
Meus pensamentos
Não entendo tecnicamente completamente por que os processos Erlang são muito mais eficientes na geração de novos processos e têm pegadas de memória muito menores por processo. O SO e a Erlang VM precisam fazer agendamento, alternar o contexto e acompanhar os valores nos registros e assim por diante ...
Simplesmente por que os threads do SO não são implementados da mesma maneira que os processos em Erlang? Eles têm que apoiar algo mais? E por que eles precisam de uma maior pegada de memória? E por que eles têm reprodução e comunicação mais lentas?
Tecnicamente, por que os processos em Erlang são mais eficientes do que os threads do SO quando se trata de geração e comunicação? E por que os threads no sistema operacional não podem ser implementados e gerenciados da mesma maneira eficiente? E por que os threads do sistema operacional têm uma maior área de armazenamento de memória, além de geração e comunicação mais lentas?
Mais leitura
erl +P 1000100 +hms 100
e digite {_, PIDs} = timer:tc(lists,map,[fun(_)->spawn(fun()->receive stop -> ok end end) end, lists:seq(1,1000000)]).
e espere cerca de três minutos para obter o resultado. Isso é tão simples. São necessários 140us por processo e 1 GB de RAM inteira no meu laptop. Mas é diretamente do shell, deve ser melhor do código compilado.