ฟังก์ชั่นการเขียนโปรแกรมไม่ได้ทำให้โปรแกรมเร็วขึ้นตามกฎทั่วไป สิ่งที่ทำให้การเขียนโปรแกรมแบบขนานและพร้อมกันง่ายขึ้น มีสองปุ่มหลักนี้:
- การหลีกเลี่ยงสถานะที่ไม่แน่นอนมีแนวโน้มที่จะลดจำนวนของสิ่งต่าง ๆ ที่อาจผิดพลาดในโปรแกรมและยิ่งไปกว่านั้นในโปรแกรมที่เกิดขึ้นพร้อมกัน
- การหลีกเลี่ยงการใช้หน่วยความจำร่วมและการซิงโครไนซ์แบบล็อกตามแนวคิดระดับสูงมักทำให้การซิงโครไนซ์ระหว่างเธรดของรหัสง่ายขึ้น
หนึ่งในตัวอย่างที่ดีของจุดที่ 2 คือว่าใน Haskell เรามีความแตกต่างที่ชัดเจนระหว่างความเท่าเทียมกำหนดขึ้นเมื่อเทียบกับการเห็นพ้องด้วยที่ไม่ได้กำหนด ไม่มีคำอธิบายใดที่ดีไปกว่าการอ้างถึงหนังสือที่ยอดเยี่ยมของ Simon Marlow การเขียนโปรแกรมแบบขนานและแบบพร้อมกันใน Haskell (คำพูดมาจากบทที่ 1 ):
โปรแกรมแบบขนานเป็นหนึ่งที่ใช้หลายหลากของฮาร์ดแวร์คอมพิวเตอร์ (เช่นแกนประมวลผลหลาย ๆ คน) เพื่อดำเนินการคำนวณได้รวดเร็วยิ่งขึ้น เป้าหมายคือเพื่อให้ได้คำตอบก่อนหน้านี้โดยมอบหมายส่วนต่าง ๆ ของการคำนวณให้กับหน่วยประมวลผลต่าง ๆ ที่ดำเนินการในเวลาเดียวกัน
ในทางกลับกันการทำงานพร้อมกันเป็นเทคนิคการจัดทำโปรแกรมซึ่งมีหลายหัวข้อของการควบคุม ตามแนวคิดแล้วหัวข้อของการควบคุมจะดำเนินการ“ ในเวลาเดียวกัน”; นั่นคือผู้ใช้เห็นผลกระทบของพวกเขา interleaved ไม่ว่าพวกเขาจะทำงานจริงในเวลาเดียวกันหรือไม่เป็นรายละเอียดการใช้งาน; โปรแกรมที่ทำงานพร้อมกันสามารถดำเนินการบนตัวประมวลผลเดียวผ่านการเรียกใช้งานแบบอินเตอร์ลีฟหรือบนตัวประมวลผลทางกายภาพหลายตัว
นอกเหนือจากนี้มาร์โลว์ยังกล่าวถึงมิติของการกำหนด :
ความแตกต่างที่เกี่ยวข้องอยู่ระหว่างโมเดลการโปรแกรมมิงแบบกำหนดแน่นอนและแบบ nondeterministic โมเดลการโปรแกรมมิงแบบกำหนดค่าคือหนึ่งในแต่ละโปรแกรมสามารถให้ผลลัพธ์เดียวเท่านั้นในขณะที่โมเดลการเขียนโปรแกรมแบบ nondeterministic ยอมรับโปรแกรมที่อาจมีผลลัพธ์ที่แตกต่างกันขึ้นอยู่กับลักษณะของการดำเนินการบางอย่าง โมเดลการโปรแกรมมิงพร้อมกันนั้นจำเป็นต้องเป็นแบบไม่ระบุชื่อเพราะมันต้องโต้ตอบกับเอเจนต์ภายนอกที่ทำให้เกิดเหตุการณ์ในเวลาที่คาดเดาไม่ได้ Nondeterminism มีข้อเสียเปรียบที่น่าสังเกตอยู่บ้าง: โปรแกรมต่างๆยากขึ้นอย่างมากในการทดสอบและเหตุผลเกี่ยวกับ
สำหรับการเขียนโปรแกรมแบบขนานเราต้องการใช้โมเดลการเขียนโปรแกรมที่กำหนดขึ้นหากเป็นไปได้ เนื่องจากเป้าหมายเพียงเพื่อให้ได้คำตอบที่รวดเร็วยิ่งขึ้นเราจะไม่ทำให้โปรแกรมของเรายากขึ้นในการดีบักในกระบวนการ การเขียนโปรแกรมแบบกำหนดแน่นอนเป็นสิ่งที่ดีที่สุดของทั้งสองโลก: การทดสอบการดีบักและการใช้เหตุผลสามารถทำได้ในโปรแกรมแบบซีเควนเชียล แต่โปรแกรมทำงานได้เร็วขึ้นด้วยการเพิ่มตัวประมวลผลเพิ่มเติม
ใน Haskell คุณสมบัติการขนานและการทำงานพร้อมกันได้รับการออกแบบรอบแนวคิดเหล่านี้ โดยเฉพาะอย่างยิ่งสิ่งที่กลุ่มภาษาอื่น ๆ รวมกันเป็นชุดคุณลักษณะหนึ่ง Haskell แยกออกเป็นสอง:
- กำหนดคุณสมบัติและห้องสมุดขนาน
- แบบไม่กำหนดคุณสมบัติและห้องสมุดเห็นพ้องด้วย
หากคุณเพียงแค่พยายามเพิ่มความเร็วในการคำนวณบริสุทธิ์ที่กำหนดขึ้นการมีความเท่าเทียมแบบกำหนดแน่นอนมักทำให้สิ่งต่าง ๆ ง่ายขึ้น บ่อยครั้งที่คุณทำอะไรแบบนี้:
- เขียนฟังก์ชั่นที่สร้างรายการคำตอบซึ่งแต่ละอันมีราคาแพงในการคำนวณ แต่ไม่ได้ขึ้นอยู่กับกันและกัน นี่คือ Haskell ดังนั้นรายการจะขี้เกียจ - คุณค่าขององค์ประกอบของพวกเขาไม่ได้คำนวณจริงจนกว่าผู้บริโภคต้องการพวกเขา
- ใช้ไลบรารีStrategiesเพื่อใช้อิลิเมนต์รายการผลลัพธ์ของฟังก์ชันของคุณควบคู่ไปกับหลายคอร์
ที่จริงผมทำอย่างนี้กับโปรแกรมโครงการของเล่นของฉันไม่กี่สัปดาห์ที่ผ่านมา มันเป็นเรื่องไม่สำคัญที่จะขนานโปรแกรม - สิ่งสำคัญที่ฉันต้องทำคือเพิ่มโค้ดบางอย่างที่บอกว่า "คำนวณองค์ประกอบของรายการนี้ในแบบคู่ขนาน" (บรรทัด 90) และฉันได้เพิ่มปริมาณงานใกล้เชิงเส้น กรณีทดสอบที่แพงกว่าของฉัน
โปรแกรมของฉันเร็วกว่าหรือไม่ถ้าฉันได้ใช้ยูทิลิตี้มัลติเธรดแบบล็อคตามปกติหรือไม่? ฉันสงสัยอย่างมาก สิ่งที่เรียบร้อยในกรณีของฉันคือการออกจากเจ้าชู้น้อยมากรหัสของฉันอาจไม่ดีนัก แต่เพราะมันเป็นเรื่องง่ายที่จะทำให้ขนานฉันได้รับการเร่งความเร็วขนาดใหญ่ด้วยความพยายามน้อยกว่าการทำโปรไฟล์ที่เหมาะสมและปรับให้เหมาะสม และไม่มีความเสี่ยงจากสภาพการแข่งขัน และที่ฉันจะเรียกร้องเป็นวิธีหลักในการเขียนโปรแกรมการทำงานช่วยให้คุณสามารถเขียนโปรแกรม "เร็ว"