คำตอบหลายข้อให้เหตุผลที่ถูกต้องว่าทำไม C ถึงเป็นหรือไม่เร็วกว่า (โดยทั่วไปหรือในบางสถานการณ์) มันปฏิเสธไม่ได้ว่า:
- ภาษาอื่น ๆ อีกมากมายให้คุณสมบัติอัตโนมัติที่เราได้รับอนุญาต การตรวจสอบขอบเขตการตรวจสอบชนิดรันไทม์และการจัดการหน่วยความจำอัตโนมัติไม่ได้มาฟรี อย่างน้อยก็มีบ้างค่าใช้จ่ายที่เกี่ยวข้องกับคุณสมบัติเหล่านี้ซึ่งเราอาจไม่ได้คิดหรือแม้แต่รู้ - ในขณะที่เขียนโค้ดที่ใช้คุณสมบัติเหล่านี้
- ขั้นตอนจากแหล่งที่มาไปยังเครื่องมักจะไม่ตรงในภาษาอื่น ๆ เช่นเดียวกับใน C
- OTOH ที่จะกล่าวว่ารหัส C ที่คอมไพล์แล้วนั้นรันได้เร็วกว่าโค้ดอื่น ๆ ที่เขียนในภาษาอื่น ๆ นั้นเป็นลักษณะทั่วไปที่ไม่เป็นความจริง ตัวอย่างเคาน์เตอร์หาง่าย (หรือโต้แย้ง)
ทั้งหมดนี้อย่างไรก็ตามมีบางสิ่งที่ฉันสังเกตเห็นว่าฉันคิดว่าส่งผลกระทบต่อประสิทธิภาพการเปรียบเทียบของ C กับภาษาอื่น ๆ อีกมากมายมากกว่าปัจจัยอื่น ๆ เพื่อปัญญา:
ภาษาอื่นมักจะทำให้การเขียนโค้ดง่ายขึ้นซึ่งช้าลง บ่อยครั้งที่มันได้รับการสนับสนุนจากปรัชญาการออกแบบของภาษา ผลที่ตามมา: โปรแกรมเมอร์ C มักจะเขียนโค้ดที่ไม่สามารถดำเนินการที่ไม่จำเป็นได้
ยกตัวอย่างเช่นพิจารณาโปรแกรม Windows อย่างง่ายที่สร้างหน้าต่างหลักเดียว รุ่น AC จะเติมWNDCLASS[EX]
โครงสร้างที่จะถูกส่งไปRegisterClass[Ex]
แล้วโทรCreateWindow[Ex]
และเข้าสู่วงข้อความ รหัสที่ง่ายและง่ายมากดังต่อไปนี้:
WNDCLASS wc;
MSG msg;
wc.style = 0;
wc.lpfnWndProc = &WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = NULL;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
wc.lpszMenuName = NULL;
wc.lpszClassName = "MainWndCls";
RegisterClass(&wc);
CreateWindow("MainWndCls", "", WS_OVERLAPPEDWINDOW | WS_VISIBLE,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
while(GetMessage(&msg, NULL, 0, 0)){
TranslateMessage(&msg);
DispatchMessage(&msg);
}
โปรแกรมที่เทียบเท่าใน C # อาจเป็นรหัสเดียว:
Application.Run(new Form());
โค้ดหนึ่งบรรทัดนี้มีฟังก์ชั่นทั้งหมดที่เกือบ 20 บรรทัดของโค้ด C ทำและเพิ่มบางสิ่งที่เราทิ้งไว้เช่นการตรวจสอบข้อผิดพลาด ห้องสมุดที่สมบูรณ์กว่านี้ (เมื่อเทียบกับที่ใช้ในโครงการ C ทั่วไป) ได้ทำงานให้เรามากมายทำให้เรามีเวลามากขึ้นในการเขียนโค้ดเพิ่มเติมอีกมากมายที่ดูสั้น แต่มีหลายขั้นตอนอยู่เบื้องหลัง
แต่ห้องสมุดที่อุดมด้วยการเปิดใช้งานการขยายโค้ดที่ง่ายและรวดเร็วไม่ใช่จุดของฉัน ประเด็นของฉันชัดเจนมากขึ้นเมื่อคุณเริ่มตรวจสอบสิ่งที่เกิดขึ้นจริงเมื่อดำเนินการหนึ่งซับของเราตัวเล็ก เพื่อความสนุกสนานในบางครั้งให้เปิดใช้งาน. NET access accessใน Visual Studio 2008 หรือสูงกว่าและเข้าสู่หนึ่งบรรทัดบรรทัดข้างต้น หนึ่งในอัญมณีเล็ก ๆ ที่สนุกที่คุณจะเจอคือความคิดเห็นในทะเยอทะยานสำหรับControl.CreateParams
:
// In a typical control this is accessed ten times to create and show a control.
// It is a net memory savings, then, to maintain a copy on control.
//
if (createParams == null) {
createParams = new CreateParams();
}
ครั้งที่สิบ ข้อมูลใกล้เคียงกับผลรวมของสิ่งที่เก็บไว้ในส่วนWNDCLASSEX
โครงสร้างและสิ่งที่ผ่านไปCreateWindowEx
จะถูกดึงจากControl
ครั้งระดับสิบก่อนที่มันจะถูกเก็บไว้ในWNDCLASSEX
โครงสร้างและการส่งผ่านไปยังและRegisterClassEx
CreateWindowEx
โดยรวมแล้วจำนวนคำสั่งที่ดำเนินการเพื่อดำเนินงานขั้นพื้นฐานนี้คือลำดับที่ 2-3 ของขนาดใน C # มากกว่าใน C ส่วนหนึ่งเป็นเพราะการใช้ไลบรารี่ที่มีคุณลักษณะหลากหลายซึ่งจำเป็นต้องมีการเปรียบเทียบกับทั่วไป รหัส C อย่างง่ายของเราซึ่งทำสิ่งที่เราต้องการอย่างแน่นอนและไม่มีอะไรเพิ่มเติม แต่ส่วนหนึ่งเป็นเพราะความจริงที่ว่าลักษณะเชิงวัตถุที่เป็นโมดูลของกรอบงาน. NET ทำให้เกิดการซ้ำซ้อนของการดำเนินการซึ่งมักจะหลีกเลี่ยงได้ด้วยวิธีการตามขั้นตอน
ฉันไม่ได้พยายามเลือก C # หรือ. NET Framework ไม่ฉันบอกว่าคุณสมบัติ modularization ลักษณะทั่วไปห้องสมุด / ภาษา OOP ฯลฯ เป็นสิ่งที่ไม่ดี ฉันเคยพัฒนาส่วนใหญ่ใน C ต่อมาใน C ++ และเมื่อเร็ว ๆ นี้ใน C # ในทำนองเดียวกันก่อน C ฉันใช้การชุมนุมเป็นส่วนใหญ่ และด้วยขั้นตอน "สูง" ในแต่ละภาษาของฉันฉันเขียนได้ดีขึ้นบำรุงรักษาได้ดีขึ้นและมีประสิทธิภาพมากขึ้นในเวลาที่น้อยลง อย่างไรก็ตามพวกเขามีแนวโน้มที่จะดำเนินการช้ากว่าเล็กน้อย