Đặc điểm của Erlang
Từ lập trình Erlang (2009):
Đồng thời Erlang là nhanh chóng và có thể mở rộng. Các quy trình của nó rất nhẹ ở chỗ máy ảo Erlang không tạo ra một luồng hệ điều hành cho mọi quy trình được tạo. Chúng được tạo, lên lịch và xử lý trong VM, độc lập với hệ điều hành cơ bản. Kết quả là, thời gian tạo quy trình là thứ tự của micro giây và không phụ thuộc vào số lượng quy trình hiện có đồng thời. So sánh điều này với Java và C #, trong đó đối với mọi quy trình, một luồng hệ điều hành cơ bản được tạo ra: bạn sẽ có được một số so sánh rất cạnh tranh, với Erlang vượt trội hơn cả hai ngôn ngữ.
Từ lập trình định hướng đồng thời trong Erlang (pdf) (slide) (2003):
Chúng tôi quan sát thấy rằng thời gian để tạo ra một quy trình Erlang là 1 hằng số lên đến 2.500 quy trình; Sau đó, nó tăng lên khoảng 3 Lời nói cho tối đa 30.000 quy trình. Hiệu năng của Java và C # được hiển thị ở trên cùng của hình. Đối với một số lượng nhỏ các quy trình, cần khoảng 300 Lời nói để tạo ra một quy trình. Tạo hơn hai nghìn quy trình là không thể.
Chúng tôi thấy rằng trong tối đa 30.000 quy trình, thời gian để gửi tin nhắn giữa hai quy trình Erlang là khoảng 0,8. Đối với C #, phải mất khoảng 50 mật khẩu cho mỗi tin nhắn, tối đa số lượng quy trình tối đa (khoảng 1800 quy trình). Java thậm chí còn tệ hơn, với tối đa 100 quy trình, phải mất khoảng 50 cảm nhận cho mỗi tin nhắn sau đó, nó đã tăng nhanh lên 10ms mỗi tin nhắn khi có khoảng 1000 quy trình Java.
Suy nghĩ của tôi
Tôi không hiểu đầy đủ về mặt kỹ thuật tại sao các quy trình Erlang hiệu quả hơn nhiều trong việc sinh ra các quy trình mới và có dấu chân bộ nhớ nhỏ hơn nhiều cho mỗi quy trình. Cả HĐH và Erlang VM đều phải lập lịch, chuyển đổi ngữ cảnh và theo dõi các giá trị trong các thanh ghi, v.v.
Đơn giản là tại sao các luồng hệ điều hành không được triển khai giống như các quy trình trong Erlang? Họ có phải hỗ trợ thêm gì không? Và tại sao họ cần một dấu chân bộ nhớ lớn hơn? Và tại sao chúng có khả năng sinh sản và giao tiếp chậm hơn?
Về mặt kỹ thuật, tại sao các quy trình trong Erlang hiệu quả hơn các luồng hệ điều hành khi nói đến sinh sản và giao tiếp? Và tại sao các luồng trong HĐH không thể được triển khai và quản lý theo cùng một cách hiệu quả? Và tại sao các luồng hệ điều hành có dung lượng bộ nhớ lớn hơn, cộng với việc sinh sản và giao tiếp chậm hơn?
Đọc thêm
erl +P 1000100 +hms 100
và hơn loại {_, PIDs} = timer:tc(lists,map,[fun(_)->spawn(fun()->receive stop -> ok end end) end, lists:seq(1,1000000)]).
và chờ khoảng ba phút để có kết quả. Điều đó thật đơn giản. Phải mất 140us cho mỗi quá trình và 1GB toàn bộ RAM trên máy tính xách tay của tôi. Nhưng nó là shell trực tiếp, nó sẽ tốt hơn từ mã được biên dịch.