Haskell / Clojure จริง ๆ แล้วไม่เหมาะสำหรับระบบไดนามิกเช่นการจำลองอนุภาค?


9

ฉันได้รับการบอกในคำถามก่อนหน้านี้ว่าภาษาโปรแกรมที่ใช้งานได้ไม่เหมาะสมสำหรับระบบแบบไดนามิกเช่นเอนจิ้นฟิสิกส์ส่วนใหญ่เป็นเพราะมันมีราคาแพงในการกลายพันธุ์วัตถุ ข้อความนี้มีความสมจริงเพียงใดและทำไม


4
คุณอาจพบgithub.com/linneman/particles-clj ที่น่าสนใจ Due to the functional programming style the computational load will be distributed over the available CPU cores which can dramatically increase processing speed in some cases

2
ใครบอกคุณว่าพวกเขาไม่เหมาะสม เชื่อมโยงไปยังคำตอบ / แสดงความคิดเห็น?
Andres F.

7
@ Dokkat: ฉันสงสัยว่าผู้แสดงความคิดเห็นรู้อะไรเกี่ยวกับการเขียนโปรแกรมการทำงานจะซื่อสัตย์มาก ฉันจะเอามันไปด้วยเกลือเม็ดใหญ่
CA McCann

6
นอกจากนี้ฉันยังไม่สนใจคำตอบที่เริ่มต้นด้วย"วิธีการทำงานที่บริสุทธิ์ไม่เหมาะสำหรับเกม ... "เว้นแต่ผู้เขียนพิสูจน์ว่าเขาได้ลองเขียนโปรแกรมฟังก์ชั่น มิฉะนั้นเขาก็แค่คาดเดาสิ่งที่เขาคิดว่าอาจเป็นปัญหา
Andres F.

1
การพัฒนาเกม @Dokkat มีข้อ จำกัด เพิ่มเติมมากกว่าแค่ตัวจำลองอนุภาคและเครื่องมือฟิสิกส์ (ซึ่งสามารถปรับให้เหมาะกับการเขียนโปรแกรมการทำงาน) - ประสิทธิภาพของเวลาทำงานเป็นหัวใจสำคัญในการพัฒนาเกม เครื่องมือฟิสิกส์สำหรับ บริษัท ขุดทำนายการระเบิดถามถึงความแม่นยำมากกว่าประสิทธิภาพ ด้วยการเขียนโปรแกรมที่ใช้งานได้ประสิทธิภาพมากขึ้นสามารถทำได้ง่ายขึ้นโดยการขว้างฮาร์ดแวร์เพิ่มเติมที่มัน (สิ่งที่เอ็นจิ้นเกมไม่สามารถทำได้)

คำตอบ:


10

ทั้ง Haskell และ Clojure อนุญาตการเปลี่ยนแปลงที่เกิดขึ้นจริงดังนั้นจึงไม่ใช่ปัญหาที่จะเริ่มต้นด้วย

นอกเหนือจากนั้นหากข้อมูล "ที่ไม่แน่นอน" ของคุณประกอบด้วยค่าระดับกลางที่ได้รับการอัปเดตเพิ่มขึ้นซึ่งเป็นส่วนหนึ่งของการคำนวณที่ใหญ่กว่าคุณอาจไม่จำเป็นต้องมีความผันแปรที่จะมีประสิทธิภาพ! ตัวอย่างเช่นมีการวิจัยอย่างต่อเนื่องใน Haskell เกี่ยวกับเทคนิคที่เรียกว่ากระแสฟิวชั่นโดยที่คอมไพเลอร์ฟิวส์ห่วงการประมวลผลผู้ผลิตข้อมูลและผู้บริโภคข้อมูลเพื่อกำจัดโครงสร้างข้อมูลกลางทั้งหมด

ปัญหาหลักของ Haskell ที่นี่คือความเกียจคร้าน - ในโปรแกรมที่มีตัวเลขจำนวนมากซึ่งคุณมีข้อมูลอินพุตจำนวนมากและข้อมูลเอาต์พุตจำนวนมากและทั้งหมดนี้มีความสำคัญความขี้เกียจทำให้คุณโปรดปรานน้อยมาก ไม่ใช่เพื่อบอกว่าคุณไม่สามารถเขียนโปรแกรมเช่นนั้นใน Haskell (คนทำจริง ๆ ) แต่มันไม่ได้เล่นกับจุดแข็งของภาษาและคุณต้องมีความเข้าใจที่ดีขึ้นของแบบจำลองการประเมินเพื่อให้ได้ประสิทธิภาพที่คุณต้องการ

ที่กล่าวว่าการบีบอัดจำนวนมากไม่ได้เล่นกับจุดแข็งของ JVM เช่นกัน โปรแกรมประเภทนั้นคือเหตุผลที่ฟอร์แทรนยังอยู่


1
เป็นข้อควรทราบ: GHC รุ่น 8.0 ที่กำลังจะมาจะสนับสนุนโหมดการประเมินผลที่เข้มงวดต่อโมดูล
Erik Kaplun

8

ฉันไม่สามารถพูดคุยกับ Clojure ได้ แต่ฉันสามารถพูดได้ว่า Haskell มีแพ็คเกจ IO ที่ได้รับการปรับจูนอย่างมากซึ่งจะทำให้การกลายพันธุ์ทั้งหมดที่คุณต้องการ

ต่อไปนี้เป็นคำตอบของคำถามที่ฉันเขียนซึ่งมีรายละเอียดของคนที่พบมากที่สุด 3 คนและเกี่ยวกับประสิทธิภาพของพวกเขา: /programming/15439966/when-why-use-an-mvar-over-a-tvar/15440286 # 15440286

นอกจากนี้คุณยังสามารถดูที่นี่กราฟอย่างง่ายแสดงตัวชี้วัดประสิทธิภาพการทำงานของเว็บ Haskell เซิร์ฟเวอร์ที่เรียกว่า Warp ซึ่งเป็นแอพลิเคชันสูงเข้มข้น IO

มีความสับสนมากมายเกี่ยวกับเรื่องนี้เกี่ยวกับ Haskell ความจริงคือมันมีสิ่งอำนวยความสะดวก IO ที่ยอดเยี่ยมพร้อมแพ็คเกจมากมายสำหรับการแฮ็กสำหรับการใช้ IO ในหลากหลายวิธีที่แตกต่างกัน เหตุผลที่ผู้คนเข้าใจว่านี่ไม่ใช่กรณีนี้เพราะ Haskell มีความยาวมากในการแยก IO ออกจากทุกสิ่งทุกอย่าง แต่นั่นไม่มีผลต่อประสิทธิภาพการทำงาน

ทีนี้ถ้าจะพูดถึงลักษณะของประสิทธิภาพการทำงานเหตุผลที่ผู้คนยอมรับว่าการมีประสิทธิภาพต่ำนั้นเกิดจากการประเมินที่ขี้เกียจทำให้มันทำงานในลักษณะที่ไม่ได้ใช้งานง่ายเสมอไป อย่างไรก็ตามนี่คือบางสิ่งที่คุณต้องกังวลเกี่ยวกับการใช้งานที่น้อยลงเมื่อคุณเริ่มทำงานในบริบทของ IO ที่ทำการอัปเดตแบบทำลายล้างเช่นในระบบที่คุณอ้างถึง คนต่อไปมักจะพบว่าเมื่อพวกเขามีปัญหาด้านประสิทธิภาพการทำงานสิ่งอำนวยความสะดวกในการใช้อุปกรณ์และการระบุว่าทรัพยากรจะช่วยได้มากแค่ไหน

Monad ที่ควรค่าแก่การมองหาระบบอย่างที่คุณอธิบายก็คือST monadซึ่งมีไว้สำหรับการอัปเดตแบบทำลายล้างที่ทำโดยการโทรแบบ IO ที่เล็กมากซึ่งให้ประสิทธิภาพที่ยอดเยี่ยม

ขออภัยฉันไม่สามารถพูดคุยกับ Clojure หวังว่าคนอื่นจะให้รายละเอียดที่นั่น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.