เขียนใน C เพื่อประสิทธิภาพ? [ปิด]


32

ฉันรู้ว่าฉันเคยได้ยินบ่อยๆว่า C มักจะมีข้อได้เปรียบด้านประสิทธิภาพมากกว่า C ++ ฉันไม่ได้คิดอย่างอื่นจนกว่าฉันจะรู้ว่า MSVC ดูเหมือนจะไม่สนับสนุนมาตรฐานใหม่ล่าสุดของ C แต่รุ่นล่าสุดรองรับ C99 (เท่าที่ฉันรู้)

ฉันวางแผนที่จะเขียนไลบรารีด้วยโค้ดบางอย่างเพื่อให้แสดงผลใน OpenGL เพื่อให้ฉันสามารถนำมาใช้ซ้ำได้ ฉันวางแผนที่จะเขียนไลบรารีใน C เนื่องจากการเพิ่มประสิทธิภาพใด ๆ ก็ยินดีต้อนรับเมื่อมันมาถึงกราฟิก

แต่มันจะคุ้มหรือไม่ รหัสที่ใช้ไลบรารีน่าจะเขียนใน C ++ และฉันต้องการรหัสใน C ++ โดยทั่วไป

อย่างไรก็ตามถ้ามันสร้างความแตกต่างเล็กน้อยในการแสดงฉันก็น่าจะไปกับ C

อาจสังเกตได้ว่าห้องสมุดนี้จะเป็นสิ่งที่ฉันจะใช้ในการทำงานกับ Windows / OS X / Linux และฉันอาจรวบรวมทุกอย่างโดยพื้นฐาน (MSVC สำหรับ Windows, Clang หรือ GCC สำหรับ OS X และ GCC สำหรับ Linux .. . หรือคอมไพเลอร์ของ Intel สำหรับทุกสิ่ง)

ฉันได้ดูไปรอบ ๆ และฉันพบว่ามีการเปรียบเทียบและเช่นนั้น แต่ทุกสิ่งที่ฉันเห็นได้เกี่ยวข้องกับ GCC มากกว่า MSVC และ Clang นอกจากนี้มาตรฐานไม่ได้พูดถึงมาตรฐานของภาษาที่ใช้ ใครมีความคิดเห็นเกี่ยวกับเรื่องนี้?

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


9
รองรับ MSVC ใหม่ล่าสุดคือ C89
Detly

4
@detly ใน Visual Studio 2013, ส่วนใหญ่ของคุณลักษณะ C99 ได้รับการสนับสนุน มันไม่ได้รับการสนับสนุนอย่างเต็มที่ แต่ฉันก็เดิมพันได้ในทางปฏิบัติมันก็โอเคที่จะใช้สำหรับการเขียน C99
congusbongus

4
@ danielu13 - ที่ไหนที่คุณได้ยินว่า C มีข้อได้เปรียบด้านประสิทธิภาพมากกว่า C ++
Ramhound

1
@ Sebastian-LaurenţiuPlesciucฉันไม่คิดว่าลิงก์เหล่านั้นมีประโยชน์จริงๆ คนแรกอาจตอบโต้ได้ดีกับคำถามแบบเดียวกันเกือบprogrammers.stackexchange.com/q/113295/76444แต่ชอบ c ++ แทนที่จะเป็น c เหมือนในลิงค์ของคุณ สำหรับลิงค์ที่สองของคุณมันเป็นแค่คำพูดของ linus torvalds ฉันหวังว่าทุกคนจะรู้ว่าตอนนี้เขาชอบเกลียด c ++ และจะไม่แตะต้องด้วยไม้เท้า แต่คำพูดของเขาเกี่ยวกับ c ++ นั้นมีจุดประสงค์แทบจะไม่พวกเขาเต็มไปด้วยความคิดเห็นส่วนตัวและอคติและไม่สะท้อนความเป็นจริงของภาษา . อย่างน้อยที่ฉันมีความคิดเห็น
user1942027

1
@RaphaelMiedl นอกจากนี้ฉันยังกล่าวถึงนี้ถูกเขียนในปี 2007 ซึ่งค่อนข้างนานแล้วที่คอมไพเลอร์ C ++ และภาษา C ++ ได้มีการพัฒนาตั้งแต่นั้นมา ขึ้นอยู่กับโปรแกรมเมอร์ที่จะเลือกภาษาที่จะใช้
Sebastian-Laurenţiu Plesciuc

คำตอบ:


89

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

ลองทำคำสั่งต่อไปนี้:

foo->doSomething(a + 5, *c);

สมมติว่าdoSomethingมีลายเซ็นต่อไปนี้เพิ่มเติม:

void doSomething(int a, long b);

ตอนนี้เรามาลองวิเคราะห์ผลกระทบที่เป็นไปได้ของแถลงการณ์นี้โดยเฉพาะ

ใน C ความหมายค่อนข้างชัดเจน fooสามารถเป็นตัวชี้ไปยัง struct เท่านั้นและdoSomethingต้องเป็นตัวชี้ไปยังฟังก์ชัน *cการเพิ่มความยาวและการa + 5เพิ่มจำนวนเต็ม ความไม่แน่นอนเพียงอย่างเดียวมาจากประเภทของa: หากไม่ใช่ int จะมีการแปลง แต่นอกเหนือจากนั้นมันง่ายที่จะหาจำนวนผลกระทบด้านประสิทธิภาพของคำสั่งเดียวนี้

ตอนนี้ลองเปลี่ยนเป็น C ++ ข้อความเดียวกันนี้สามารถมีคุณสมบัติด้านประสิทธิภาพที่แตกต่างกันมาก:

  1. doSomethingอาจเป็นฟังก์ชั่นสมาชิกที่ไม่ใช่เสมือน (ราคาถูก), ฟังก์ชั่นสมาชิกเสมือน (แพงกว่านิดหน่อย) std::function, แลมบ์ดา ... เป็นต้นสิ่งที่แย่กว่านั้นfooอาจเป็นประเภทคลาสที่บรรทุกเกินพิกัดoperator->ด้วยการดำเนินการบางอย่างที่ซับซ้อน ดังนั้นเพื่อที่จะวัดปริมาณค่าใช้จ่ายของการโทรdoSomethingก็ตอนนี้จำเป็นที่จะต้องรู้ธรรมชาติที่แท้จริงของและfoodoSomething
  2. aอาจจะเป็นจำนวนเต็มหรืออ้างอิงถึงจำนวนเต็ม (ร้ายเพิ่มเติม) operator+(int)หรือประเภทชั้นเรียนซึ่งการดำเนินการ intผู้ประกอบการยังสามารถส่งกลับชนิดชั้นอื่นซึ่งเป็นปริยายแปลงสภาพให้แก่ อีกครั้งต้นทุนประสิทธิภาพไม่ชัดเจนจากคำสั่งเพียงอย่างเดียว
  3. coperator*()อาจจะเป็นประเภทระดับการดำเนินการ มันอาจจะเป็นการอ้างอิงถึงlong*ฯลฯ

คุณได้รับรูปภาพ เนื่องจาก c ++ 's คุณลักษณะของภาษามันเป็นเรื่องยากที่จะหาจำนวนค่าใช้จ่ายในการปฏิบัติงานเป็นคำสั่งเดียวมากกว่าที่เป็นอยู่ใน C. ในตอนนี้นอกจากนี้แนวคิดเช่นstd::vector, std::stringมักใช้ใน C ++ ซึ่งมีลักษณะการทำงานของพวกเขาเองและจัดสรรหน่วยความจำซ่อนแบบไดนามิก ( ดูคำตอบของ @ Ian ด้วย)

ดังนั้นกำไรคือ: โดยทั่วไปไม่มีความแตกต่างในประสิทธิภาพที่เป็นไปได้โดยใช้ C หรือ C ++ แต่สำหรับโค้ดที่มีประสิทธิภาพที่สำคัญจริง ๆ ผู้คนมักนิยมใช้ C เพราะมีบทลงโทษที่ซ่อนเร้นอยู่


1
คำตอบที่ยอดเยี่ยม นี่คือสิ่งที่ฉันพูดถึงในคำตอบของฉัน แต่คุณอธิบายได้ดีกว่ามาก
Ian Goldby

4
นี่ควรเป็นคำตอบที่ได้รับการยอมรับจริงๆ มันอธิบายว่าทำไมข้อความเช่น "C เร็วกว่า C ++" มีอยู่ C สามารถเร็วหรือช้ากว่า C ++ ได้ แต่โดยทั่วไปแล้วจะง่ายกว่ามากในการหาสาเหตุที่รหัส C บางส่วนนั้นเร็ว / ช้าซึ่งมักทำให้ง่ายขึ้นในการปรับให้เหมาะสม
Leo

อย่าเอาอะไรจากคำตอบที่ยอดเยี่ยมนี้ (ซึ่ง +1 จากฉัน) แต่คอมไพเลอร์ (s) สามารถเป็นแอปเปิ้ลและส้มในการเปรียบเทียบนี้ มัน / พวกเขาอาจสร้างรหัสที่เหมือนกันสำหรับ C กับ C ++ หรือไม่ แน่นอนว่าสามารถพูดได้เหมือนกันสำหรับคอมไพเลอร์สองตัวเลือกหรือตัวเลือกคอมไพเลอร์แม้เมื่อรวบรวมโปรแกรมเดียวกันทางกายภาพด้วยสมมติฐานภาษาต้นฉบับเดียวกัน
JRobert

4
ฉันจะเพิ่มว่ารันไทม์ C ++ ส่วนใหญ่มีขนาดใหญ่เมื่อเทียบกับรันไทม์ C เทียบเท่าซึ่งจะสำคัญถ้าคุณมีหน่วยความจำ จำกัด
James Anderson

@JamesAnderson หากคุณจริงๆว่าหน่วยความจำที่ จำกัด คุณอาจไม่จำเป็นต้องรันไทม์ที่ :) ทั้งหมด
นาวิน

30

โค้ดที่เขียนใน C ++ สามารถเร็วกว่าใน C สำหรับงานบางประเภท

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


6
อาจเร็วกว่า แต่ก็อาจไม่เร็วกว่าด้วยเหตุผลเดียวกัน
Rob

คุณสามารถยกตัวอย่างโค้ดที่ได้รับการปรับปรุงในภาษา C ++ ที่เร็วกว่า C ที่เหมาะสมที่สุดได้หรือไม่?

1
@TomDworzanski: ตัวอย่างหนึ่งคือการใช้แม่แบบการตัดสินใจเกี่ยวกับเส้นทางของรหัสสามารถกำหนดได้ในเวลารวบรวมและจบลงด้วย hardcoded ในไบนารีสุดท้ายแทนที่จะเป็นเงื่อนไขและการแตกแขนงตามที่จำเป็นถ้ามันถูกเขียนใน c เช่นเดียวกับความสามารถ เพื่อหลีกเลี่ยงการเรียกใช้ฟังก์ชันผ่านอินไลน์
whatsisname

23

หนึ่งในหลักการออกแบบของ C ++ คือคุณไม่ต้องจ่ายเงินสำหรับคุณสมบัติที่คุณไม่ได้ใช้ ดังนั้นหากคุณเขียนโค้ดใน C ++ และหลีกเลี่ยงฟีเจอร์ที่ไม่มีอยู่ใน C ดังนั้นโค้ดที่คอมไพล์แล้วจะให้ผลการทำงานที่เทียบเท่า (แม้ว่าคุณจะต้องทำการวัด)

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


3
ฟังก์ชั่นค่าใช้จ่ายการจัดส่งเสมือนเป็นเพียงเล็กน้อยเท่านั้นเว้นแต่ว่าคุณได้ไปทางลงน้ำในการย่อยสลายและทำให้สิ่งต่าง ๆ เสมือนจริง vtables จะมีขนาดเล็กเมื่อเทียบกับส่วนที่เหลือของรหัสและข้อมูลของคุณและสาขาที่จัดทำดัชนีผ่าน vtable จะเพิ่มนาฬิกาสองสามดวงในแต่ละการเรียกใช้ประจำ เมื่อมีการร้องขอเป็นประจำทุกครั้งที่โทรกลับไปจะอยู่ที่ใดก็ได้ตั้งแต่สองสามร้อยถึงสองสามล้านนาฬิกาสาขา vtable จะถูกฝังไว้ในพื้นเสียง
John R. Strohm

6
Structs เป็นคลาสใน C ++
rightfold

2
@ Rightfold: แน่นอน แต่คุณยังคงสามารถเขียนรหัส C ++ ที่ส่งผ่านพอยน์เตอร์ไปยังโครงสร้างโดยไม่ต้องใช้thisคุณสมบัติภาษาพอยน์เตอร์ นั่นคือทั้งหมดที่ฉันพูด
Greg Hewgill

4
@John ราคาจริงไม่ใช่ทางอ้อม (แม้ว่าฉันค่อนข้างแน่ใจว่านี่จะค่อนข้างสกรูกับตัวประมวลผลล่วงหน้าบางส่วน) แต่ความจริงที่ว่าคุณไม่สามารถอินไลน์ฟังก์ชั่นเสมือน (ใน C ++ อย่างน้อย) ซึ่งไม่สามารถทำได้ การเพิ่มประสิทธิภาพ และใช่ว่าจะมีอิทธิพลอย่างมากต่อประสิทธิภาพการทำงาน
Voo

2
@Voo เพื่อความเป็นธรรมสามารถพูดได้เหมือนกันเกี่ยวกับรหัส C ที่เทียบเท่ากัน (รหัสที่เลียนแบบรันไทม์หลากหลายรูปแบบด้วยตนเอง) ความแตกต่างที่ยิ่งใหญ่ที่สุดคือฉันเชื่อว่าการคอมไพเลอร์จะง่ายขึ้นหากพิจารณาว่าฟังก์ชันดังกล่าวสามารถอินไลน์ได้ใน C ++
Thomas Eding

14

เหตุผลหนึ่งที่ภาษาระดับสูงกว่าบางครั้งช้าลงก็คือพวกเขาสามารถซ่อนเบื้องหลังการจัดการหน่วยความจำได้มากขึ้นกว่าภาษาระดับต่ำกว่า

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

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

ดังนั้นใช้ C ++ ถ้าคุณต้องการ แต่อย่าหลงเชื่อด้วยความสะดวกสบายที่เป็นนามธรรมเมื่อคุณไม่รู้ว่าอะไรซ่อนอยู่ข้างใต้

แน่นอนใช้ profiler เพื่อค้นหาว่าโค้ดของคุณช้าลงเพียงใด


5

สำหรับสิ่งที่คุ้มค่าฉันมักจะเขียนไลบรารีของฉันใน C ++ 11 สำหรับชุดคุณลักษณะขั้นสูง ฉันชอบที่จะสามารถใช้ประโยชน์จากสิ่งต่าง ๆ เช่นพอยน์เตอร์ที่ใช้ร่วมกันข้อยกเว้นการเขียนโปรแกรมทั่วไปและคุณลักษณะเฉพาะ C ++ อื่น ๆ ฉันชอบ C ++ 11 เพราะฉันพบว่าบิตที่ดีนั้นได้รับการสนับสนุนในทุกแพลตฟอร์มที่ฉันสนใจ Visual Studio 2013 มีจำนวนมากของคุณสมบัติหลักภาษาและการใช้งานห้องสมุดพร้อมที่จะไปคาดคะเนและเป็นคนที่ทำงานเกี่ยวกับการเพิ่มส่วนที่เหลือ อย่างที่คุณทราบกันดีว่าเสียงดังกราวและ GCC รองรับทั้งชุดคุณลักษณะทั้งหมดเช่นกัน

จากที่กล่าวมาเมื่อเร็ว ๆ นี้ฉันได้อ่านเกี่ยวกับกลยุทธ์ที่ยอดเยี่ยมเกี่ยวกับการพัฒนาห้องสมุดที่ฉันคิดว่าเกี่ยวข้องโดยตรงกับการสืบค้นของคุณ บทความนี้มีชื่อว่า"รูปแบบการจัดการข้อผิดพลาด AC ที่เล่นได้ดีกับข้อยกเว้น C ++" Stefanu Du Toit อ้างถึงกลยุทธ์นี้ว่าเป็นรูปแบบ "นาฬิกาทราย" ย่อหน้าแรกของบทความ:

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


ตอนนี้เพื่อแก้ไขข้อกังวลหลักของคุณ: ประสิทธิภาพ

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

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


ตอนนี้เพื่อความสนุกสนานในการอ่านเกี่ยวกับคุณสมบัติและการปรับแต่งภาษาให้เหมาะกับคุณ:

std :: unique_ptr มีค่าใช้จ่ายเป็นศูนย์

constexp ช่วยให้การคำนวณเวลารวบรวม

ซีแมนทิกส์เคลื่อนที่ป้องกันวัตถุชั่วคราวที่ไม่จำเป็น


std::unique_ptr has zero overheadสิ่งนี้อาจไม่เป็นจริง (การพูดทางเทคนิค) เพราะมันจะต้องมีคอนสตรัคเตอร์ของมันเรียกว่าสแต็กคลายเนื่องจากข้อยกเว้น ตัวชี้แบบดิบไม่มีค่าใช้จ่ายนี้และยังคงถูกต้องหากรหัสของคุณอาจไม่แสดง คอมไพเลอร์จะไม่สามารถพิสูจน์ได้ในกรณีทั่วไป
Thomas Eding

2
@ThomasEding ฉันหมายถึงขนาดและค่าใช้จ่ายรันไทม์ที่เกี่ยวกับรหัสที่ไม่มีข้อยกเว้น แก้ไขให้ฉันถ้าฉันผิด แต่มีรูปแบบการดำเนินการที่ไม่มีค่าใช้จ่ายในการดำเนินการศูนย์เมื่อข้อยกเว้นไม่ถูกส่งออกไป ดังนั้นแม้เมื่อจะมีข้อยกเว้นที่เคยถูกโยนในตัวสร้างของunique_ptr? มีการประกาศnoexceptและอย่างน้อยที่สุดก็จัดการข้อยกเว้นทั้งหมด แต่ฉันไม่สามารถจินตนาการได้ว่าข้อยกเว้นประเภทใดที่อาจถูกโยนได้ตั้งแต่แรก
vmrob

vmrob: ให้อภัยฉัน ... ฉันตั้งใจจะเขียน "destructor" แทน "constructor" ฉันยังตั้งใจที่จะเขียนว่า "จะไม่โยน" เกินไป Eeek!
Thomas Eding

2
@ThomasEding คุณรู้ไหมฉันไม่คิดว่ามันจะสำคัญถ้าผู้ทำลายล้างเกิดข้อยกเว้น ตราบใดที่ destructor ไม่ได้แนะนำข้อยกเว้นใหม่ ๆ มันก็ยังไม่มีการทำลายค่าใช้จ่าย ยิ่งกว่านั้นฉันเชื่อว่า destructor ทั้งหมดจะได้รับการโทรลบ / ฟรีเพียงครั้งเดียวพร้อมการเพิ่มประสิทธิภาพ
vmrob

4

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

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

สิ่งที่มีค่าใช้จ่ายสูง C ++ ดึงดูดให้คุณทำคือการจัดการหน่วยความจำมากเกินไปการเขียนโปรแกรมสไตล์การแจ้งเตือนการเชื่อถือตัวนับโปรแกรมของคุณไปยังห้องสมุดนามธรรมที่มีหลายชั้น (ตามที่ @Ian กล่าว) ซ่อนความช้าเป็นต้น


2

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

C ++ อาจมีประสิทธิภาพแตกต่างกันอย่างมากไม่ว่าช้าหรือเร็วขึ้นหาก (1) คุณใช้ไลบรารี C ++ มาตรฐานเพื่อทำสิ่งต่าง ๆ ที่สามารถทำได้เร็วกว่าและง่ายกว่ามากโดยไม่ต้องใช้ไลบรารีหรือ (2) ถ้าคุณใช้ไลบรารี C ++ มาตรฐาน จะทำสิ่งต่าง ๆ ได้ง่ายขึ้นและเร็วขึ้นกว่าเดิมโดยการปรับใช้ไลบรารีใน bad C. ใหม่


1
สิ่งนี้ดูเหมือนจะไม่เสนออะไรมากมายกับสิ่งที่อธิบายไว้ในคำตอบก่อนหน้า 6 คำตอบ
ริ้น

ฉันคิดว่าคำตอบนี้กล่าวถึงจุดสำคัญที่ไม่มีใครพูดถึง จากภาพรวมในครั้งแรกดูเหมือนว่า C ++ จะเป็นชุดของ C ดังนั้นหากคุณสามารถเขียนการติดตั้ง C ที่รวดเร็วคุณควรจะสามารถเขียน C ++ ที่เทียบเท่าได้ อย่างไรก็ตาม C99 รองรับคำหลัก จำกัด ซึ่งอนุญาตให้หลีกเลี่ยงการใช้นามแฝงตัวชี้โดยไม่ได้ตั้งใจ C ++ ไม่มีการสนับสนุนดังกล่าว ความสามารถในการหลีกเลี่ยงนามแฝงของตัวชี้เป็นคุณสมบัติที่สำคัญของ Fortran ที่ทำให้มีประโยชน์สำหรับแอปพลิเคชันที่มีประสิทธิภาพสูง ฉันคาดหวังว่ามันเป็นไปได้ที่จะบีบประสิทธิภาพที่ดีขึ้นจาก C99 กว่า C ++ ในโดเมนที่คล้ายกัน
user27539
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.