ก่อนอื่น (IMO) เปรียบเทียบกับ Python แทบไม่มีความหมาย การเปรียบเทียบกับ Objective-C เท่านั้นที่มีความหมาย
- ภาษาการเขียนโปรแกรมใหม่จะเร็วขึ้นได้อย่างไร?
Objective-C เป็นภาษาที่ช้า (เฉพาะส่วน C เท่านั้นที่เร็ว แต่นั่นเป็นเพราะมันคือ C) มันไม่เคยเร็วขนาดนี้มาก่อน มันเร็วพอสำหรับจุดประสงค์ (Apple) ของพวกเขาและเร็วกว่ารุ่นเก่ากว่า และมันช้าเพราะ ...
- Objective-C เป็นผลมาจากคอมไพเลอร์ที่ไม่ดีหรือมีบางสิ่งที่มีประสิทธิภาพน้อยกว่าใน Objective-C กว่า Swift หรือไม่?
Objective-C รับประกันว่าทุกวิธีจะทำการส่งแบบไดนามิก ไม่มีการจัดส่งคงที่ทั้งหมด ทำให้ไม่สามารถเพิ่มประสิทธิภาพโปรแกรม Objective-C ต่อไปได้ บางทีเทคโนโลยี JIT อาจช่วยได้บ้าง แต่ AFAIK นั้น Apple เกลียดการทำงานที่ไม่สามารถคาดเดาได้และอายุการใช้งานของวัตถุ ฉันไม่คิดว่าพวกเขาจะนำสิ่ง JIT มาใช้ Swift ไม่มีการรับประกันการจัดส่งแบบไดนามิกเว้นแต่ว่าคุณจะใส่คุณสมบัติพิเศษบางอย่างสำหรับความเข้ากันได้ของ Objective-C
- คุณจะอธิบายประสิทธิภาพที่เพิ่มขึ้น 40% ได้อย่างไร ฉันเข้าใจว่าการรวบรวมขยะ / การควบคุมการอ้างอิงอัตโนมัติอาจทำให้เกิดโอเวอร์เฮดเพิ่มเติม
GC หรือ RC ไม่สำคัญที่นี่ Swift กำลังใช้ RC เป็นหลัก ไม่มี GC อยู่ที่นั่นและจะไม่เว้นแต่จะมีการกระโดดข้ามสถาปัตยกรรมขนาดใหญ่ในเทคโนโลยี GC (IMO มันเป็นตลอดไป) ฉันเชื่อว่า Swift มีพื้นที่เหลือเฟือสำหรับการเพิ่มประสิทธิภาพแบบคงที่ โดยเฉพาะอย่างยิ่งอัลกอริธึมการเข้ารหัสระดับต่ำเนื่องจากพวกเขามักจะใช้การคำนวณตัวเลขจำนวนมากและนี่เป็นชัยชนะครั้งใหญ่สำหรับการส่งภาษาแบบคงที่
ที่จริงฉันแปลกใจเพราะ 40% ดูเหมือนว่าจะเล็กเกินไป ฉันคาดหวังมากกว่านี้ อย่างไรก็ตามนี่เป็นรุ่นเริ่มต้นและฉันคิดว่าการเพิ่มประสิทธิภาพไม่ใช่ประเด็นหลัก Swift ไม่ได้มีคุณสมบัติครบถ้วน! พวกเขาจะทำให้ดีขึ้น
ปรับปรุง
บางคนก็ชักชวนให้ฉันเถียงว่าเทคโนโลยี GC นั้นเหนือกว่า แม้ว่าสิ่งต่าง ๆ ด้านล่างสามารถพิสูจน์ได้และเป็นเพียงความเห็นที่ลำเอียง แต่ฉันคิดว่าฉันต้องพูดเพื่อหลีกเลี่ยงการโต้แย้งที่ไม่จำเป็นนี้
ฉันรู้ว่า GCs แบบอนุรักษ์นิยม / การติดตาม / การเพิ่ม / ขนาน / เรียลไทม์นั้นแตกต่างกันอย่างไร ฉันคิดว่าผู้อ่านส่วนใหญ่ก็รู้เช่นกัน ฉันยอมรับด้วยว่า GC นั้นดีมากในบางสาขาและยังแสดงปริมาณงานสูงในบางกรณี
อย่างไรก็ตามฉันสงสัยว่าการรับส่ง GC จะดีกว่า RC เสมอ ค่าใช้จ่ายส่วนใหญ่ของ RC มาจากการดำเนินการนับการอ้างอิงและการล็อกเพื่อป้องกันตัวแปรหมายเลขการนับ และการใช้งาน RC มักจะให้วิธีการหลีกเลี่ยงการนับการดำเนินการ ใน Objective-C มี__unsafe_unretained
และสวิฟท์ (แม้ว่ามันจะยังคงค่อนข้างไม่ชัดเจนให้ฉัน) unowned
วัตถุดิบ หากค่าใช้จ่ายในการดำเนินการนับไม่เป็นที่ยอมรับคุณสามารถลองยกเลิกการเลือกโดยการใช้กลไก ในทางทฤษฎีเราสามารถจำลองสถานการณ์ที่เกือบจะเป็นกรรมสิทธิ์โดยใช้การอ้างอิงที่ไม่ได้เก็บรักษาไว้อย่างจริงจังเพื่อหลีกเลี่ยงค่าใช้จ่าย RC ฉันคาดหวังว่าคอมไพเลอร์สามารถกำจัดการทำงาน RC ที่ไม่จำเป็นออกไปโดยอัตโนมัติ
ไม่เหมือนกับระบบ RC AFAIK การเลือกไม่ใช้บางส่วนของการอ้างอิงไม่ใช่ตัวเลือกในระบบ GC
ฉันรู้ว่ามีกราฟิกและเกมที่วางจำหน่ายจำนวนมากซึ่งใช้ระบบที่ใช้ GC และยังรู้ว่าพวกเขาส่วนใหญ่กำลังทุกข์ทรมานจากการขาดการกำหนด ไม่เพียง แต่สำหรับคุณสมบัติด้านประสิทธิภาพ แต่ยังจัดการกับอายุการใช้งาน ความสามัคคีส่วนใหญ่เขียนด้วยภาษาซีพลัสพลัส แต่ส่วนเล็ก ๆ ของ C # เป็นสาเหตุของปัญหาเรื่องประสิทธิภาพที่แปลก แอพ HTML ไฮบริดและยังคงทุกข์ทรมานจาก spikes ที่คาดเดาไม่ได้ในระบบใด ๆ ใช้กันอย่างแพร่หลายไม่ได้หมายความว่ามันยอดเยี่ยม หมายความว่าง่ายและเป็นที่นิยมสำหรับผู้ที่ไม่มีตัวเลือกมากมาย
อัปเดต 2
อีกครั้งเพื่อหลีกเลี่ยงการโต้แย้งหรือการอภิปรายที่ไม่จำเป็นฉันเพิ่มรายละเอียดเพิ่มเติม
@Asik ให้ความเห็นที่น่าสนใจเกี่ยวกับ GC spikes นั่นคือเราสามารถพิจารณาวิธีการที่มีมูลค่าทุกที่เป็นวิธีในการเลือกไม่ใช้สิ่ง GC นี่เป็นสิ่งที่ค่อนข้างน่าสนใจและยังสามารถทำได้ในบางระบบ (ตัวอย่างเช่นวิธีการทำงานอย่างแท้จริง) ฉันเห็นด้วยว่านี่เป็นสิ่งที่ดีในทางทฤษฎี แต่ในทางปฏิบัติมันมีหลายประเด็น ปัญหาที่ใหญ่ที่สุดคือการประยุกต์ใช้เคล็ดลับนี้บางส่วนไม่ได้ให้ลักษณะที่ไม่ขัดขวาง
เพราะปัญหาความหน่วงมักจะเป็นปัญหาทั้งหมดหรือไม่มีปัญหาเสมอไป หากคุณมีตัวขัดขวางเฟรมหนึ่งเฟรมเป็นเวลา 10 วินาที (= 600 เฟรม) แสดงว่าระบบทั้งหมดล้มเหลวอย่างเห็นได้ชัด นี่ไม่ได้เกี่ยวกับวิธีที่ดีขึ้นหรือแย่ลง มันแค่ผ่านหรือล้มเหลว (หรือน้อยกว่า 0.0001%) แล้วแหล่งที่มาของเข็ม GC คืออะไร? นั่นคือการกระจายโหลด GC ที่ไม่ดี และนั่นเป็นเพราะ GC เป็นพื้นฐานที่ไม่ทราบแน่ชัด หากคุณทำขยะใด ๆ มันจะเปิดใช้งาน GC และขัดขวางจะเกิดขึ้นในที่สุด แน่นอนในโลกอุดมคติที่ซึ่งการโหลด GC จะเป็นอุดมคติเสมอสิ่งนี้จะไม่เกิดขึ้น แต่ฉันอาศัยอยู่ในโลกแห่งความเป็นจริงมากกว่าโลกอุดมคติในจินตนาการ
จากนั้นหากคุณต้องการหลีกเลี่ยงการขัดขวางคุณต้องลบประเภทอ้างอิงทั้งหมดออกจากระบบทั้งหมด แต่มันก็เป็นเรื่องที่ยากวิกลจริตและเป็นไปไม่ได้เนื่องจากส่วนที่ไม่สามารถเคลื่อนย้ายได้เช่น. NET core system และ library การใช้ระบบที่ไม่ใช่ GC นั้นง่ายกว่ามาก
ซึ่งแตกต่างจาก GC, RC นั้นถูกกำหนดโดยพื้นฐานและคุณไม่จำเป็นต้องใช้การปรับให้เหมาะสมแบบบ้าคลั่ง สิ่งที่คุณต้องทำคือการติดตามและปรับแต่งส่วนที่เป็นสาเหตุของการขัดขวาง ในระบบ RC สไปค์เป็นปัญหาอัลกอริทึมเฉพาะที่ แต่ในระบบ GC สไปค์มักเป็นปัญหาของระบบทั่วโลกเสมอ
ฉันคิดว่าคำตอบของฉันหายไปมากเกินไปและส่วนใหญ่เป็นเพียงการพูดคุยซ้ำ ๆ ที่มีอยู่ หากคุณต้องการอ้างสิทธิ์เหนือกว่า / ต่ำต้อย / ทางเลือกหรือสิ่งอื่นใดของ GC / RC มีการสนทนาที่มีอยู่มากมายในไซต์นี้และ StackOverflow และคุณสามารถต่อสู้ต่อไปได้