ลักษณะของ Erlang
จากการเขียนโปรแกรม Erlang (2009):
การทำงานพร้อมกันของ Erlang นั้นรวดเร็วและสามารถปรับขนาดได้ กระบวนการมีน้ำหนักเบาซึ่งเครื่องเสมือน Erlang ไม่ได้สร้างเธรด OS สำหรับทุกกระบวนการที่สร้างขึ้น พวกเขาถูกสร้างกำหนดเวลาและจัดการใน VM เป็นอิสระจากระบบปฏิบัติการพื้นฐาน เป็นผลให้เวลาการสร้างกระบวนการเป็นลำดับไมโครวินาทีและเป็นอิสระจากจำนวนกระบวนการที่มีอยู่พร้อมกัน เปรียบเทียบสิ่งนี้กับ Java และ C # ซึ่งทุกขั้นตอนจะสร้างเธรด OS พื้นฐานขึ้นมา: คุณจะได้รับการเปรียบเทียบที่แข่งขันได้มากโดย Erlang มีประสิทธิภาพเหนือกว่าทั้งสองภาษา
จากการเขียนโปรแกรมเชิง Concurrency ใน Erlang (pdf) (สไลด์) (2003):
เราสังเกตว่าเวลาที่ใช้ในการสร้างกระบวนการ Erlang นั้นมีค่าคงที่ 1 ถึง 2,500 กระบวนการ; หลังจากนั้นจะเพิ่มขึ้นเป็นประมาณ 3 วินาทีสำหรับกระบวนการมากถึง 30,000 กระบวนการ ประสิทธิภาพของ Java และ C # จะแสดงที่ด้านบนของภาพ สำหรับกระบวนการจำนวนน้อยจะใช้เวลาประมาณ 300 วินาทีในการสร้างกระบวนการ การสร้างกระบวนการมากกว่าสองพันรายการเป็นไปไม่ได้
เราเห็นว่าสำหรับกระบวนการมากถึง 30,000 กระบวนการเวลาในการส่งข้อความระหว่างสองกระบวนการของ Erlang นั้นประมาณ 0.8µs สำหรับ C # ใช้เวลาประมาณ 50 ต่อข้อความขึ้นกับจำนวนสูงสุดของกระบวนการ (ซึ่งประมาณ 1800 กระบวนการ) Java ยิ่งแย่ลงสำหรับกระบวนการมากถึง 100 กระบวนการนั้นใช้เวลาประมาณ 50 ต่อข้อความหลังจากนั้นจะเพิ่มขึ้นอย่างรวดเร็วเป็น 10ms ต่อข้อความเมื่อมีกระบวนการ Java ประมาณ 1,000 กระบวนการ
ความคิดของฉัน
ฉันไม่เข้าใจอย่างถ่องแท้ในทางเทคนิคว่าเหตุใดกระบวนการ Erlang จึงมีประสิทธิภาพมากกว่าในการวางไข่กระบวนการใหม่และมี footprints หน่วยความจำที่เล็กลงต่อกระบวนการ ทั้งระบบปฏิบัติการและ Erlang VM ต้องทำการตั้งเวลาสลับบริบทและติดตามค่าในรีจิสเตอร์และอื่น ๆ ...
ทำไมเธรด OS จึงไม่นำไปใช้ในวิธีเดียวกันกับกระบวนการใน Erlang พวกเขาต้องสนับสนุนอะไรมากกว่านี้ไหม? และทำไมพวกเขาต้องการรอยความทรงจำที่ใหญ่กว่า? และทำไมพวกเขาถึงมีการวางไข่และสื่อสารช้าลง?
ในทางเทคนิคเหตุใดกระบวนการใน Erlang จึงมีประสิทธิภาพมากกว่าเธรด OS เมื่อพูดถึงการวางไข่และการสื่อสาร และทำไมไม่สามารถใช้งานและจัดการเธรดในระบบปฏิบัติการได้อย่างมีประสิทธิภาพเหมือนกัน? และทำไมเธรด OS จึงมีหน่วยความจำขนาดใหญ่กว่ารวมถึงการวางไข่และการสื่อสารที่ช้าลง
อ่านเพิ่มเติม
erl +P 1000100 +hms 100
และดีกว่าพิมพ์{_, PIDs} = timer:tc(lists,map,[fun(_)->spawn(fun()->receive stop -> ok end end) end, lists:seq(1,1000000)]).
แล้วรอผลประมาณ 3 นาที มันง่ายมาก ใช้ 140usas ต่อกระบวนการและ RAM 1GB ทั้งหมดบนแล็ปท็อปของฉัน แต่มันเป็นรูปแบบเชลล์โดยตรงมันควรจะดีกว่าจากการคอมไพล์โค้ด