Charakterystyka Erlanga
Z Erlang Programming (2009):
Współbieżność Erlang jest szybka i skalowalna. Jego procesy są lekkie, ponieważ maszyna wirtualna Erlang nie tworzy wątku systemu operacyjnego dla każdego utworzonego procesu. Są tworzone, planowane i obsługiwane na maszynie wirtualnej niezależnie od bazowego systemu operacyjnego. W rezultacie czas tworzenia procesu jest rzędu mikrosekund i jest niezależny od liczby równolegle istniejących procesów. Porównaj to z Javą i C #, gdzie dla każdego procesu tworzony jest podstawowy wątek systemu operacyjnego: otrzymasz bardzo konkurencyjne porównania, z Erlangiem znacznie przewyższającym oba języki.
Z programowania współbieżnego w Erlang (pdf) (slajdy) (2003):
Obserwujemy, że czas potrzebny do stworzenia procesu Erlanga jest stały 1 µs do 2500 procesów; następnie wzrasta do około 3 µs do 30 000 procesów. Wydajność Java i C # jest pokazana u góry rysunku. W przypadku niewielkiej liczby procesów utworzenie procesu zajmuje około 300 µs. Stworzenie ponad dwóch tysięcy procesów jest niemożliwe.
Widzimy, że dla maksymalnie 30 000 procesów czas wysłania wiadomości między dwoma procesami Erlanga wynosi około 0,8 µs. W przypadku C # zajmuje to około 50 µs na wiadomość, aż do maksymalnej liczby procesów (czyli około 1800 procesów). Java była jeszcze gorsza, do 100 procesów zajmowało około 50 µs na wiadomość, po czym gwałtownie wzrosła do 10 ms na wiadomość, gdy było około 1000 procesów Java.
Moje myśli
Nie do końca rozumiem technicznie, dlaczego procesy Erlanga są o wiele bardziej wydajne w tworzeniu nowych procesów i mają znacznie mniejsze zużycie pamięci na proces. Zarówno system operacyjny, jak i maszyna wirtualna Erlang muszą wykonywać harmonogramy, przełączać konteksty, śledzić wartości w rejestrach i tak dalej ...
Dlaczego po prostu wątki systemu operacyjnego nie są implementowane w taki sam sposób, jak procesy w Erlang? Czy muszą wspierać coś więcej? Dlaczego potrzebują większej ilości pamięci? I dlaczego mają wolniejsze tarło i komunikację?
Technicznie, dlaczego procesy w Erlangu są wydajniejsze niż wątki systemu operacyjnego, jeśli chodzi o tworzenie i komunikację? I dlaczego nie można wdrażać i zarządzać wątkami w systemie operacyjnym w ten sam skuteczny sposób? I dlaczego wątki systemu operacyjnego mają większy ślad pamięci oraz wolniejsze tworzenie i komunikację?
Więcej czytania
erl +P 1000100 +hms 100
a następnie wpisz {_, PIDs} = timer:tc(lists,map,[fun(_)->spawn(fun()->receive stop -> ok end end) end, lists:seq(1,1000000)]).
i poczekaj około trzech minut na wynik. To takie proste. Zajmuje 140us na proces i 1 GB całej pamięci RAM na moim laptopie. Ale jest to bezpośrednio z powłoki, powinno być lepsze od skompilowanego kodu.