Karakteristik Erlang
Dari Erlang Programming (2009):
Konkurensi erlang cepat dan terukur. Prosesnya ringan karena mesin virtual Erlang tidak membuat utas OS untuk setiap proses yang dibuat. Mereka dibuat, dijadwalkan, dan ditangani dalam VM, independen dari sistem operasi yang mendasarinya. Akibatnya, waktu pembuatan proses adalah urutan mikrodetik dan independen dari jumlah proses yang ada secara bersamaan. Bandingkan ini dengan Java dan C #, di mana untuk setiap proses thread OS yang mendasarinya dibuat: Anda akan mendapatkan beberapa perbandingan yang sangat kompetitif, dengan Erlang mengungguli kedua bahasa.
Dari pemrograman berorientasi Concurrency di Erlang (pdf) (slide) (2003):
Kami mengamati bahwa waktu yang diperlukan untuk membuat proses Erlang adalah konstan 1μs hingga 2.500 proses; setelah itu meningkat menjadi sekitar 3μs hingga 30.000 proses. Kinerja Java dan C # ditampilkan di bagian atas gambar. Untuk sejumlah kecil proses, dibutuhkan sekitar 300 μs untuk membuat proses. Membuat lebih dari dua ribu proses adalah hal yang mustahil.
Kami melihat bahwa hingga 30.000 proses waktu untuk mengirim pesan antara dua proses Erlang adalah sekitar 0,8 μs. Untuk C # dibutuhkan sekitar 50μs per pesan, hingga jumlah maksimum proses (yaitu sekitar 1800 proses). Java bahkan lebih buruk, untuk hingga 100 proses dibutuhkan sekitar 50 μs per pesan setelah itu meningkat pesat menjadi 10 ms per pesan ketika ada sekitar 1000 proses Java.
Pikiran saya
Saya tidak sepenuhnya mengerti secara teknis mengapa proses Erlang jauh lebih efisien dalam memunculkan proses baru dan memiliki jejak memori yang jauh lebih kecil per proses. Baik OS dan Erlang VM harus melakukan penjadwalan, konteks switch, dan melacak nilai-nilai dalam register dan seterusnya ...
Hanya mengapa thread OS tidak diimplementasikan dengan cara yang sama dengan proses di Erlang? Apakah mereka harus mendukung sesuatu yang lebih? Dan mengapa mereka membutuhkan jejak memori yang lebih besar? Dan mengapa mereka memiliki pemijahan dan komunikasi yang lebih lambat?
Secara teknis, mengapa proses di Erlang lebih efisien daripada utas OS ketika menyangkut pemijahan dan komunikasi? Dan mengapa thread di OS tidak dapat diimplementasikan dan dikelola dengan cara yang efisien? Dan mengapa utas OS memiliki jejak memori yang lebih besar, ditambah pemijahan dan komunikasi yang lebih lambat?
Lebih banyak membaca
erl +P 1000100 +hms 100
dan ketikkan {_, PIDs} = timer:tc(lists,map,[fun(_)->spawn(fun()->receive stop -> ok end end) end, lists:seq(1,1000000)]).
dan kemudian tunggu sekitar tiga menit untuk hasil. Itu sangat sederhana. Dibutuhkan 140us per proses dan 1GB seluruh RAM pada laptop saya. Tapi itu bentuk langsung shell, itu harus lebih baik dari kode yang dikompilasi.