Optimizing C and C++ code for Embedded System !! episode 2 (Thai language)
Sat, 08/09/2014 - 06:11 — ataya_p
Written
by
:
Ataya P
Date
: 12 June 2007
Language
: Thai
ไปไงกันบ้างครับ
กับบทความการ Optimize ซอร์สโค้ดเมื่อครั้งก่อน
หวังว่าคงช่วยให้ทุกๆท่านเขียนโปรแกรมได้อย่างมีประสิทธิภาพมากขึ้นนะครับ
คราวนี้จะเป็นเรื่องการปรับแต่งในส่วนของ Local variable และ Function
call กันบ้างนะครับ ลองทดลองดูว่าได้ผลเป็นยังไงกัน
ก็บอกกล่าวกันได้นะครับผม (^_^)/"
->Minimize
Local Variable
หากจำนวน Lacal Variable
ในฟังก์ชันของเรามีการประกาศไว้น้อย compiler สามารถที่จะใส่ค่าของ Local
Variable เหล่านั้นไว้ใน Register ได้โดยตรง
ซึ่งจะเป็นการเพิ่มประสิทธิภาพอย่างมหาศาลอันเนื่องมาจาก
# เนื่องจากค่าของ
Local
Variable อยู่ใน Register จึงสามารถเข้าถึงได้โดยตรง ไม่ต้องอ้างอิงจาก
Memory (ซึ่งมีการเข้าถึงที่ช้ากว่ามาก)
# หากมี
Local
Variable
ในฟังก์ชันเป็นจำนวนน้อยๆก็จะไม่ต้องประสบปัญหาOverhead ในการเก็บค่าคงใน
Stack ซึ่งจะอาจเกิดขึ้นได้ตอนที่ Setting up function และ Store frame
buffer
->
Declare Local Variables In The Inner Most Scope
ไม่ควรประกาศ Local
Variable ไว้นอกเหนือขอบเขตการใช้งาน
เราจะได้ประสิทธิภาพที่ดีกว่า หากเอา Local Variable ไว้ในขอบเขตที่ใช้งาน
(เนื่องจากไม่ต้องทำ Constructor โดยไม่จำเป็นหากไม่ได้มีการใช้งาน Local
Variable นั้นๆ)
int fool(char * pName)
int good(char * pName)
{ A a;
{ :
:
:
if(pName == NULL)
if(pName == NULL)
{
{ A a;
dosomething(a) ;
dosomething(a);
return ERROR;
====>
return ERROR;
}
}
:
:
:
:
return SUCCESS;
return SUCCESS;
}
}
->
Reduce the number of parameter
การ Call
ฟังก์ชันโดยมีการส่งค่า parameters
จำนวนมากๆจะเป็นการถ่วงประสิทธิภาพการทำงานอย่างมาก เนื่องจากต้อง Load
parameter ทั้งหมดลง Stack ก่อนในการ Call แต่ละครั้ง
ดังนั้นด้วยเหตุผลดังกล่าวมาแล้ว จึงไม่ควรที่จะส่ง Stucture เป็น
paremeter แบบตรงๆ แต่ควรจะใช้ pointer ในการส่งแบบ reference แทน
int fool(structA a, sturctB b,int c ,
int d, .....) { }
======>
int good( structA * a,int value) { }
-> Use
References For Parameter Passing And Return Value For Types Bigger Than
4 Bytes
ในการ Passing parameters
เป็นเรื่องปกติที่ค่าของ Parameter จะถูก Copy ลงใน Stack (
สำหรับ parameter ที่เป็นชนิด Interger ,Pointer เป็นต้น
ซึ่งจะมีขนาดจำกัดอยู่ไม่เกิน 4 Byte ) แต่หาก parameter ที่ทำการ Passing
มีขนาดใหญ่มากกว่า 4 Byte แล้วละก็จะเป็นการเพิ่ม Overhead
อย่างมากในการนำค่าเหล่านี้ลงใน Stack (ในกรณีของ Class จะเป็นการเพิ่ม
Overhead ในส่วนของการสร้าง Constructor ซึ่งจะต้องทำการ Destructor
ด้วยเมื่อออกจากFunction ที่เรียกใช้งาน)
เป็นการดีกว่า ถ้าจะจะใช้การ passing
parameter แบบ Reference สำหรับparameter ที่มีขนาดใหญ่กว่า 4
Byte เนื่องจากจะไม่เกิด Overhead จากการสร้าง
Temporary Object, Copy และ Destructor (อนึ่ง ในการส่งค่า
Return จากฟังก์ชัน หากส่งค่าที่มีขนาดใหญ่มากๆก็จะมีปัญหา Overhead
เช่นเดียวกัน)
->
Don't Define A Return Value If Not Used
หาก Function ที่ถูกเรียก
ไม่ได้จำเป็นที่จะต้องส่งค่า Return ทุกครั้ง
เราควรหลีกเลี่ยงด้วยการไม่ทำการ Define Return Value หากไม่มีการใช้งาน
int test(int x)
{ //int N
if(x == 0) return 1;
if(x == 1) return 2;
:
:
// return
N;