อะไรคือสิ่งที่ควบคุม "ความเร็ว" ของภาษาการเขียนโปรแกรม?
ไม่มีสิ่งเช่น "ความเร็ว" ของภาษาการเขียนโปรแกรม มีความเร็วของโปรแกรมเฉพาะที่เขียนโดย progammer เฉพาะที่ดำเนินการโดยรุ่นเฉพาะของการใช้งานเฉพาะของโปรแกรมเรียกใช้งานเฉพาะที่ทำงานอยู่ในสภาพแวดล้อมเฉพาะ
อาจมีความแตกต่างด้านประสิทธิภาพอย่างมากในการเรียกใช้รหัสเดียวกันที่เขียนในภาษาเดียวกันบนเครื่องเดียวกันโดยใช้การใช้งานที่แตกต่างกัน หรือแม้กระทั่งใช้เวอร์ชันที่แตกต่างกันของการใช้งานเดียวกัน ตัวอย่างเช่นการรัน ECMAScript มาตรฐานเดียวกันบนเครื่องเดียวกันโดยใช้ SpiderMonkey จากเมื่อ 10 ปีที่แล้วกับรุ่นหนึ่งในปีนี้อาจให้ประสิทธิภาพเพิ่มขึ้นระหว่าง 2 × –5 ×อาจเท่ากับ 10 × นั่นหมายความว่า ECMAScript นั้นเร็วกว่า ECMAScript 2 เท่าเพราะการรันโปรแกรมเดียวกันบนเครื่องเดียวกันนั้นเร็วกว่า 2 เท่าเมื่อใช้งานใหม่กว่าหรือไม่ ไม่สมเหตุสมผลเลย
สิ่งนี้เกี่ยวข้องกับการจัดการหน่วยความจำหรือไม่?
ไม่ได้จริงๆ
ทำไมสิ่งนี้ถึงเกิดขึ้น
ทรัพยากร เงิน Microsoft อาจจ้างคนทำกาแฟให้กับโปรแกรมเมอร์คอมไพเลอร์มากกว่าชุมชน PHP, Ruby และ Python รวมกันทำให้คนทำงานกับ VM ของพวกเขา
สำหรับคุณสมบัติของภาษาการเขียนโปรแกรมที่ส่งผลกระทบต่อประสิทธิภาพในบางวิธีก็มีวิธีแก้ไขเช่นกัน ตัวอย่างเช่น C (ฉันใช้ C ที่นี่เป็นสแตนอินสำหรับชั้นเรียนของภาษาที่คล้ายกันซึ่งบางอันมีอยู่ก่อน C) ไม่ปลอดภัยสำหรับหน่วยความจำดังนั้นโปรแกรม C หลายโปรแกรมที่ทำงานในเวลาเดียวกันสามารถเหยียบย่ำ ความทรงจำของกันและกัน ดังนั้นเราจึงคิดค้นหน่วยความจำเสมือนและทำให้โปรแกรม C ทั้งหมดผ่านเลเยอร์ทางอ้อมเพื่อให้พวกเขาสามารถแสร้งทำเป็นว่าเป็นคนเดียวที่ทำงานบนเครื่อง อย่างไรก็ตามนั่นช้าและเราคิดค้น MMU และใช้หน่วยความจำเสมือนในฮาร์ดแวร์เพื่อเร่งความเร็ว
แต่! ภาษาที่ใช้หน่วยความจำไม่จำเป็นต้องมีทุกสิ่ง! การมีหน่วยความจำเสมือนไม่ได้ช่วยอะไรเลยแม้แต่นิดเดียว ที่จริงแล้วมันแย่กว่า: ไม่เพียง แต่หน่วยความจำเสมือนจะไม่ช่วยให้ภาษาที่ปลอดภัยสำหรับหน่วยความจำหน่วยความจำเสมือนแม้จะถูกนำมาใช้ในฮาร์ดแวร์ยังคงส่งผลกระทบต่อประสิทธิภาพการทำงาน อาจเป็นอันตรายอย่างยิ่งต่อประสิทธิภาพการทำงานของตัวรวบรวมขยะ (ซึ่งเป็นสิ่งที่มีการใช้งานอย่างมากในการใช้ภาษาที่ปลอดภัยสำหรับหน่วยความจำ)
อีกตัวอย่างหนึ่ง: ซีพียูที่ใช้งานทั่วไปกระแสหลักที่ทันสมัยใช้ลูกเล่นที่ซับซ้อนเพื่อลดความถี่ของการพลาดแคช กลอุบายจำนวนมากในการพยายามทำนายรหัสที่จะถูกเรียกใช้และสิ่งที่หน่วยความจำจะต้องใช้ในอนาคต อย่างไรก็ตามสำหรับภาษาที่มีระดับความแปรปรวนแบบรันไทม์สูง (เช่นภาษา OO) เป็นเรื่องยากที่จะคาดการณ์รูปแบบการเข้าถึงเหล่านั้น
แต่มีวิธีอื่น: ค่าใช้จ่ายรวมของการพลาดแคชคือจำนวนแคชที่พลาดไปคูณด้วยค่าใช้จ่ายของการแคชแต่ละครั้งที่พลาด ซีพียูหลักพยายามลดจำนวนการพลาด แต่ถ้าคุณสามารถลดค่าใช้จ่ายของการพลาดแต่ละครั้งได้
ซีพียู Azul Vega-3 ได้รับการออกแบบมาโดยเฉพาะสำหรับการใช้งาน JVM แบบเสมือนจริงและมี MMU ที่ทรงพลังมากพร้อมคำแนะนำเฉพาะสำหรับการช่วยในการรวบรวมขยะและตรวจจับการหลบหนี (การวิเคราะห์แบบไดนามิกเทียบเท่ากับ ยังคงสามารถดำเนินการต่อได้โดยมีแคชค้างมากกว่า 20000 รายการที่พลาดอยู่ในเที่ยวบิน น่าเสียดายที่เหมือนกับซีพียูเฉพาะภาษาส่วนใหญ่การออกแบบนั้นใช้งานง่ายและถูกควบคุมโดยเดรัจฉานยักษ์, Intel, AMD, IBM และอื่น ๆ
สถาปัตยกรรม CPU เป็นเพียงตัวอย่างหนึ่งที่มีผลกระทบต่อความง่ายหรือความยากลำบากในการใช้งานภาษาที่มีประสิทธิภาพสูง ภาษาเช่น C, C ++, D, Rust ที่เหมาะสำหรับซีพียูการเขียนโปรแกรมกระแสหลักรุ่นใหม่จะทำให้เร็วกว่าภาษาที่ต้อง "สู้" และหลีกเลี่ยง CPU เช่น Java, ECMAScript, Python, Ruby , PHP
จริงๆแล้วมันเป็นคำถามของเงินทั้งหมด หากคุณใช้จ่ายเงินเท่ากันเพื่อพัฒนาอัลกอริทึมประสิทธิภาพสูงใน ECMAScript, การใช้งาน ECMAScript ประสิทธิภาพสูง, ระบบปฏิบัติการประสิทธิภาพสูงที่ออกแบบมาสำหรับ ECMAScript, CPU ประสิทธิภาพสูงที่ออกแบบมาสำหรับ ECMAScript ตามที่ได้ใช้ไปในช่วงที่ผ่านมา ทศวรรษที่ผ่านมาในการทำให้ภาษาที่มีลักษณะคล้าย C เป็นไปอย่างรวดเร็วจากนั้นคุณจะเห็นประสิทธิภาพที่เท่าเทียมกัน ในเวลานี้เงินจำนวนมากถูกใช้ไปกับการสร้างภาษาแบบ C เร็วกว่าการทำให้ภาษาแบบ ECMAScript เร็วขึ้นและสมมติฐานของภาษาแบบ C จะถูกนำไปใช้กับสแต็กทั้ง MMU และซีพียูไปสู่ระบบปฏิบัติการและ ระบบหน่วยความจำเสมือนมากถึงไลบรารีและกรอบงาน
โดยส่วนตัวแล้วฉันคุ้นเคยกับ Ruby มากที่สุด (ซึ่งโดยทั่วไปถือว่าเป็น "ภาษาช้า") ดังนั้นฉันจะให้สองตัวอย่าง: Hash
คลาส (หนึ่งในโครงสร้างข้อมูลกลางใน Ruby, พจนานุกรมค่าคีย์) ใน Rubinius การติดตั้งทับทิมนั้นเขียนด้วยทับทิมบริสุทธิ์ 100% และมีประสิทธิภาพเทียบเท่ากับHash
class ใน YARV (การใช้งานที่ใช้กันอย่างแพร่หลายที่สุด) ซึ่งเขียนใน C. และมีไลบรารี่การจัดการรูปภาพที่เขียนเป็นส่วนขยาย C สำหรับ YARV ซึ่งมี "fallback version" สำหรับทับทิมบริสุทธิ์ ไม่รองรับ C ซึ่งใช้เทคนิค ruby แบบไดนามิกและไตร่ตรองมากมาย สาขาทดลองของ JRuby โดยใช้เฟรมเวิร์กล่าม Truffle AST และเฟรมเวิร์กการรวบรวม Graal JIT โดย Oracle Labs สามารถดำเนินการทับทิม Ruby "fallback version" ได้เร็วที่สุดเท่าที่ YARV สามารถรันเวอร์ชัน C ที่ได้รับการปรับปรุงประสิทธิภาพสูงสุด นี่เป็นเพียงแค่ (ดีอะไรก็ได้) ที่ทำได้โดยคนที่ฉลาดบางคนทำสิ่งที่ฉลาดจริงๆด้วยการเพิ่มประสิทธิภาพรันไทม์แบบไดนามิกการรวบรวม JIT และการประเมินผลบางส่วน