Характеристики Ерланга
З програми Erlang Programming (2009):
Паралельність Erlang - це швидка та масштабована. Його процеси легкі тим, що віртуальна машина Erlang не створює нитку ОС для кожного створеного процесу. Вони створюються, плануються та обробляються в VM, незалежно від базової операційної системи. Як результат, час створення процесу має порядок мікросекунд і не залежить від кількості одночасно існуючих процесів. Порівняйте це з Java та C #, де для кожного процесу створюється базовий потік ОС: ви отримаєте дуже конкурентоспроможні порівняння, при цьому Erlang значно перевершує обидві мови.
З програмування, орієнтованого на сумісність, в Ерланге (pdf) (слайди) (2003):
Ми спостерігаємо, що час, необхідний для створення процесу Ерланга, є постійним від 1 мкс до 2500 процесів; після цього вона збільшується до приблизно 3 мкс для до 30 000 процесів. Продуктивність Java та C # показана у верхній частині рисунка. Для невеликої кількості процесів потрібно близько 300 мкс для створення процесу. Створити більше двох тисяч процесів неможливо.
Ми бачимо, що до 30 000 процесів час для надсилання повідомлення між двома процесами Erlang становить приблизно 0,8 мкс. Для C # потрібно близько 50 мкс на повідомлення, аж до максимальної кількості процесів (що склало близько 1800 процесів). Java була ще гіршою, тому що до 100 процесів займало близько 50 мкс на повідомлення, після чого вона швидко збільшувалась до 10 мс на повідомлення, коли було близько 1000 процесів Java.
Мої думки
Я не повністю розумію технічно, чому процеси Ерланг настільки ефективніші в нересту нових процесів і мають значно менші сліди пам’яті за процес. І ОС, і Erlang VM повинні робити планування, контекстні комутатори та відслідковувати значення в регістрах і так далі ...
Просто чому потоки ОС не реалізовані так само, як процеси в Erlang? Чи повинні вони підтримувати щось більше? І навіщо їм більший слід пам’яті? І чому у них повільніший нерест і спілкування?
Технічно, чому процеси в Erlang ефективніші, ніж потоки ОС, якщо мова йде про нерест і спілкування? І чому потоки в ОС не можуть бути реалізовані та керовані таким же ефективним способом? І чому потоки ОС мають більший слід пам’яті, а також більш повільний нерест і зв’язок?
Більше читання
erl +P 1000100 +hms 100
і, а потім наберіть {_, PIDs} = timer:tc(lists,map,[fun(_)->spawn(fun()->receive stop -> ok end end) end, lists:seq(1,1000000)]).
і зачекайте приблизно три хвилини на результат. Це так просто. На мій ноутбук потрібно 140 літрів за процес і 1 ГБ оперативної пам’яті. Але це безпосередньо оболонка форми, вона повинна бути краще від складеного коду.