cal -culculus: ประสิทธิภาพสูงสุดในการแสดงฟังก์ชั่นหน่วยความจำคืออะไร?


9

ฉันต้องการเปรียบเทียบประสิทธิภาพของฟังก์ชั่นเข้ารหัส (Church's / Scott's) เทียบกับโครงสร้างข้อมูลที่เข้ารหัสคลาสสิก (แอสเซมเบลอร์ / C)

แต่ก่อนที่ฉันจะทำสิ่งนั้นฉันต้องรู้ว่าประสิทธิภาพ / สามารถเป็นตัวแทนของฟังก์ชันในหน่วยความจำได้อย่างไร ฟังก์ชั่นนี้สามารถใช้งานได้บางส่วน (ปิดหรือที่รู้จัก)

ฉันสนใจทั้งอัลกอริธึมการเข้ารหัสปัจจุบันภาษาการใช้งานที่ได้รับความนิยม (Haskell, ML) ใช้และในภาษาที่มีประสิทธิภาพที่สุดที่สามารถทำได้


จุดโบนัส: มีการเข้ารหัสดังกล่าวว่าแผนที่ฟังก์ชั่นการเข้ารหัสจำนวนเต็มจำนวนเต็มพื้นเมือง ( short, intฯลฯ ใน C) เป็นไปได้ไหม


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


ความพยายามของ Google ทั้งหมดของฉันล้มเหลวบางทีฉันอาจไม่รู้คำหลักที่ถูกต้อง
ฟอร์ดทุม

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

1
อันนี้ค่อนข้างกว้าง มีเครื่องนามธรรมมากมายสำหรับแคลคูลัสแลมบ์ดาซึ่งมีเป้าหมายที่จะดำเนินการอย่างมีประสิทธิภาพ (ดูเช่น SECD, CAM, Krivine's, STG) ยิ่งไปกว่านั้นคุณต้องพิจารณาข้อมูลที่เข้ารหัสของโบสถ์ / สก็อตซึ่งทำให้เกิดปัญหามากขึ้น เช่นในรายการที่เข้ารหัสของศาสนจักรการดำเนินการหางต้องเป็น O (n) แทน O (1) ฉันคิดว่าฉันอ่านที่ไหนสักแห่งว่าการเข้ารหัสสำหรับรายการใน System F กับการดำเนินการส่วนหัวและท้าย O (1) ยังคงเป็นปัญหาที่เปิดอยู่
ไค

@DW ฉันกำลังพูดถึงประสิทธิภาพ / ค่าใช้จ่าย ตัวอย่างเช่นการเข้ารหัสการแมปที่มีประสิทธิภาพเหนือรายการของโบสถ์และรายการของ Haskell ควรใช้เวลาเดียวกัน
ฟอร์ดโอ

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

คำตอบ:


11

สิ่งนี้คือมีการเข้ารหัสฟังก์ชันไม่มากนัก นี่คือตัวเลือกหลัก:

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

  • การปิด: คุณมีวิธีในการแสดงฟังก์ชั่น, อาจเป็นโครงสร้างต้นไม้, รหัสเครื่องจักรที่เป็นไปได้มากกว่า และในฟังก์ชั่นเหล่านี้คุณอ้างถึงข้อโต้แย้งของคุณโดยการอ้างอิงในทางใดทางหนึ่ง มันอาจเป็นตัวชี้ - ชดเชยมันอาจเป็นจำนวนเต็มหรือดัชนี De Bruijn มันอาจเป็นชื่อ จากนั้นคุณจะแสดงถึงฟังก์ชั่นเป็นการปิด : ฟังก์ชั่น "คำแนะนำ" (ต้นไม้รหัส ฯลฯ ) จับคู่กับโครงสร้างข้อมูลที่มีตัวแปรอิสระทั้งหมดของฟังก์ชั่น เมื่อฟังก์ชั่นถูกนำไปใช้จริงมันก็จะรู้วิธีการค้นหาตัวแปรอิสระในโครงสร้างข้อมูลของมันโดยใช้สภาพแวดล้อมการคำนวณทางคณิตศาสตร์เป็นต้น

ฉันแน่ใจว่ามีตัวเลือกอื่น ๆ แต่สิ่งเหล่านี้เป็นตัวเลือกพื้นฐานและฉันสงสัยว่าตัวเลือกอื่น ๆ เกือบทุกตัวจะเป็นตัวแปรหรือการเพิ่มประสิทธิภาพของโครงสร้างการปิดพื้นฐาน

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

ฉันสนใจทั้งอัลกอริทึมการเข้ารหัสปัจจุบันใช้งานฟังก์ชั่นภาษายอดนิยม (Haskell, ML)

ฉันไม่ได้เป็นผู้เชี่ยวชาญ แต่ฉันเป็น 99% ของรสชาติ ML ส่วนใหญ่ใช้รูปแบบของการปิดที่ฉันอธิบายถึงแม้ว่าจะมีการเพิ่มประสิทธิภาพบางอย่าง ดูสิ่งนี้สำหรับมุมมอง (อาจล้าสมัย)

Haskell ไม่สิ่งบิตซับซ้อนมากขึ้นเพราะขี้เกียจของการประเมินผล: จะใช้ใจเสาะ Tagless กราฟการเขียนใหม่

และยังมีประสิทธิภาพมากที่สุดที่สามารถทำได้

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

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

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

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

จุดโบนัส: มีการเข้ารหัสดังกล่าวที่แมปฟังก์ชั่นการเข้ารหัสจำนวนเต็มกับจำนวนเต็ม (สั้น int ฯลฯ ใน C) เป็นไปได้ไหม

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

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

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

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