Objective-C หล่นลงมาในความต่อเนื่องของประสิทธิภาพของภาษาหรือไม่


20

ดูเหมือนว่าจะมีการถกเถียงกันมากมายเกี่ยวกับข้อดีความเร็วต่าง ๆ กับ C หรือ C ++ เมื่อเทียบกับ Java หรือ Python แต่ฉันไม่ค่อยเห็น Objective-C ที่กล่าวถึง ประมาณว่ามันอยู่ในแง่ของประสิทธิภาพภาษา?


23
1986 - แบรดค็อกซ์และทอมเลิฟสร้างวัตถุประสงค์ -C ประกาศ "ภาษานี้มีความปลอดภัยของหน่วยความจำทั้งหมดของ C รวมกับความเร็วที่เห็นได้ชัดของ Smalltalk" นักประวัติศาสตร์สมัยใหม่สงสัยว่าทั้งสองคนเป็น dyslexic ( ต้นฉบับ )
Mason Wheeler

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

1
"ประสิทธิภาพ" ไม่ใช่ลักษณะของภาษา แต่เป็นการนำภาษาไปใช้และที่สำคัญกว่านั้นคือโปรแกรมที่เขียนด้วยภาษานั้น คุณสามารถเขียนโปรแกรมที่รวดเร็วมากใน Objective-C หรือเขียนโปรแกรมช้ามาก
แม็กเคเล็บ

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

คำตอบ:


28

ซึ่งแตกต่างจาก 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 ++ ที่สำคัญที่สุด หากคุณไม่ได้รับประสิทธิภาพที่ดีให้ตรวจสอบอัลกอริทึมของคุณ เช่นเดียวกับภาษาที่จริงจัง


4
ในความเป็นจริงวัตถุประสงค์ที่ทันสมัย ​​c เป็นเรื่องเกี่ยวกับ supersetty เป็น C ++ ที่ทันสมัย ใน C คุณได้รับอนุญาตให้ทำเลขคณิตเกี่ยวกับพอยน์เตอร์พอยต์คุณไม่สามารถใช้ ObjC ได้ ความแตกต่างของประสิทธิภาพเนื่องจากการค้นหาเมธอดนั้นสามารถวัดได้: เส้นทางที่รวดเร็วของ objc_msgSend นั้นหนักกว่าการเรียกฟังก์ชันของสมาชิกประมาณสี่เท่า (และเส้นทางที่ช้านั้นไม่เร็วเท่ากับเส้นทางที่เร็ว)

11

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


1
พบการเปรียบเทียบประสิทธิภาพนี้กับ C: rmarcus.info/?p=488ดูเหมือนว่า Objective-C นั้นค่อนข้างใกล้เคียงกับ C.
OlliP

คงจะดีถ้าเปรียบเทียบ Objective C กับชุดที่เหลือ Benchmarks 'Game
Deer Hunter

ฉันคิดว่าการเปรียบเทียบประสิทธิภาพต้องใช้เกลือบางส่วนเนื่องจากรหัส Objective-C คือการขยายรหัส C และไม่ส่งข้อความ Objecttive-C ฉันไม่รู้ว่าการ downrating นั้นมีไว้เพื่ออะไร ฉันพัฒนา Smalltalk มานานกว่าทศวรรษและ Objective-C นั้นยึดตาม Smalltalk ในหลาย ๆ ด้าน ฉันคิดว่ารู้ว่าฉันกำลังพูดถึงอะไร
OlliP

ไม่ใช่ผู้ลงคะแนน ฉันสนใจในขั้นตอนวิธีเชิงตัวเลขเป็นหลักการส่งแบบไดนามิกไม่สำคัญมาก ภายในเหล่านั้น
Deer Hunter

8

คำตอบสั้น ๆ : มันถูกคอมไพล์ในรูปแบบที่คล้ายกันเป็น C / C ++ / D / Go / Rust ไม่ใช้สภาพแวดล้อมเสมือนเช่น Java / .Net และมันจะไม่ถูกตีความเช่น Python / Ruby / Lua / JavaScript ดังนั้นมันจึงอยู่ที่ปลายสเปกตรัมที่เร็วกว่า


7

ความแตกต่างของความเร็วพื้นฐานระหว่าง 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 แคชหายไป

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