ดูเหมือนว่าจะมีการถกเถียงกันมากมายเกี่ยวกับข้อดีความเร็วต่าง ๆ กับ C หรือ C ++ เมื่อเทียบกับ Java หรือ Python แต่ฉันไม่ค่อยเห็น Objective-C ที่กล่าวถึง ประมาณว่ามันอยู่ในแง่ของประสิทธิภาพภาษา?
ดูเหมือนว่าจะมีการถกเถียงกันมากมายเกี่ยวกับข้อดีความเร็วต่าง ๆ กับ C หรือ C ++ เมื่อเทียบกับ Java หรือ Python แต่ฉันไม่ค่อยเห็น Objective-C ที่กล่าวถึง ประมาณว่ามันอยู่ในแง่ของประสิทธิภาพภาษา?
คำตอบ:
ซึ่งแตกต่างจาก C ++, Objective-C ได้รับการออกแบบให้เป็นชุดซูเปอร์เซ็ตที่สะอาดของ C คอมไพเลอร์ Objective-C บางตัวที่ฉันเคยใช้นั้นเป็นที่รู้จักกันดีในชื่อคอมไพเลอร์ C แต่ยังรองรับ Objective-C
ดังนั้นจึงปลอดภัยที่จะสมมติว่าในระดับการสร้างโค้ด C และ Objective-C นั้นเทียบเท่ากัน
ความแตกต่างแรกปรากฏใน OOP ABI หรือที่เรียกว่า "การผูกวิธีล่าช้า" เช่นเดียวกับใน C ++ Objective-C อาศัยตารางตัวชี้ฟังก์ชันที่คอมไพเลอร์สร้างขึ้นซึ่งถูกส่งไปที่รันไทม์
ซึ่งแตกต่างจาก C ++ อย่างไรก็ตามวิธีการเชื่อมโยงนั้นมีความ 'ไดนามิก' มากกว่าและส่งเสริมการใช้id
ซูเปอร์คลาสทุกที่ทำให้มันช้ากว่า C ++ เล็กน้อยในทางทฤษฎี ในทางปฏิบัติความแตกต่างนี้เป็นวิธีที่วัดได้ต่ำกว่า
ในที่สุดปัญหาด้านประสิทธิภาพที่สำคัญที่สุดคือคุณภาพของห้องสมุดที่ใช้ เนื่องจาก Objective-C เป็นที่นิยมในระบบ Apple เท่านั้นจึงมีเหตุผลที่จะถือว่าคุณใช้กับ Cocoa ซึ่งเป็นชุดของไลบรารีระดับสูง ในกรณีส่วนใหญ่คุณสามารถปล่อยให้ยกของหนัก ๆ ได้ดังนั้นโค้ดของคุณก็ไม่จำเป็นต้องเร็วนักหรือถ้าคุณทำ crunching หนัก ๆ มันก็น่าจะเป็นฐานโค้ดแบบสแตติกส่วนใหญ่คล้าย ๆ กับ C ธรรมดา .
TL; DR: มันอยู่ที่นั่นด้วยภาษา C และ C ++ ที่สำคัญที่สุด หากคุณไม่ได้รับประสิทธิภาพที่ดีให้ตรวจสอบอัลกอริทึมของคุณ เช่นเดียวกับภาษาที่จริงจัง
Objective-C ช้ากว่า C / C ++ เหตุผลที่เป็นรันไทม์ของ Objective-C ซึ่งส่งเมธอดการค้นหาแบบไดนามิกที่รันไทม์ในลักษณะเดียวกับ Smalltalk ซึ่งมันใช้กับโมเดลการดำเนินการนี้ ยื้อเมธอดทั้งหมดที่รันไทม์ถูกเรียกว่า "การส่งข้อความที่แท้จริง" ซึ่งตรงข้ามกับการเรียกใช้ฟังก์ชันใน C / C ++ โดยที่ฟังก์ชั่นที่อยู่จะถูกกำหนดในเวลารวบรวม (ยกเว้นวิธีการเสมือน C ++) แต่ฉันไม่สามารถบอกได้ว่า Objective-C ช้ากว่านี้มากแค่ไหน ASAIK ใช้สำหรับการพัฒนาแอพพลิเคชั่นเท่านั้นเนื่องจากมีการปรับประสิทธิภาพ
คำตอบสั้น ๆ : มันถูกคอมไพล์ในรูปแบบที่คล้ายกันเป็น C / C ++ / D / Go / Rust ไม่ใช้สภาพแวดล้อมเสมือนเช่น Java / .Net และมันจะไม่ถูกตีความเช่น Python / Ruby / Lua / JavaScript ดังนั้นมันจึงอยู่ที่ปลายสเปกตรัมที่เร็วกว่า
ความแตกต่างของความเร็วพื้นฐานระหว่าง Obj-C และ C / C ++ ดังที่โอลิเวอร์กล่าวไว้ด้านล่างนี้เป็นผลมาจากวิธีการแจกจ่ายแบบไดนามิก
บทความนี้โปรไฟล์ค่าใช้จ่ายนี้ใน Obj-C http://it.toolbox.com/blogs/macsploitation/bypassing-objectivecs-message-passing-mechanism-for-speed-24946
นอกจากนี้ยังมีเคล็ดลับที่ดีมากสำหรับการเพิ่มประสิทธิภาพรหัส Obj-C ของคุณเมื่อคุณกำหนดวิธีการจัดส่ง (เช่น objc_msgSend) เป็นปัจจัย จำกัด - รับตัวชี้ไปยังฟังก์ชั่นหนึ่งครั้งและใช้มันเพื่อเรียกฟังก์ชั่นหลาย ๆ ครั้ง ไม่ควรช่วยมากนักเพราะObj-C runtimes ทำการปรับให้เหมาะสมนี้โดยอัตโนมัติทำเพิ่มประสิทธิภาพนี้โดยอัตโนมัติ
โปรดทราบว่าค่าใช้จ่ายจริงของวิธีการจัดส่งแบบไดนามิกนั้นเกิดจากการคิดถึงแคช สิ่งเหล่านี้ยากที่จะทำโปรไฟล์และอาจเป็นไปได้ว่ารหัสที่อ้างถึงข้างต้นไม่ได้วัดค่าใช้จ่ายที่ผิดพลาดจริง
การสนทนาที่เป็นประโยชน์เพิ่มเติมอยู่ที่นี่: http://www.cocoabuilder.com/archive/cocoa/106535-instance-variable-access.html#106605
บรรทัดล่าง: ความแตกต่างที่ใหญ่ที่สุดระหว่างภาษาคืออัลกอริธึมของคุณ นอกเหนือจากนั้นมีความแตกต่างความเร็วพื้นฐานระหว่าง Obj-C, C, และ C ++ เนื่องจากวิธีการส่งแบบไดนามิกหรือเสมือน จุดที่สองนี้ดูเหมือนจะไม่ใหญ่ และบทความข้างต้นให้เคล็ดลับในการปรับให้เหมาะสมถ้าคุณสามารถหาจุดร้อนผ่านการทำโปรไฟล์ซึ่งอาจเป็นเรื่องยากเนื่องจาก CPU แคชหายไป