Written
by
: Ataya P
Date : 12 June 2007
Language : Thai
ไปไงกันบ้า งครับ
กับบ ความการ Optimize ซอร์สโค้ดเ มื่อครั้งก ่อน
หวัง ่าคงช่วยใ ้ทุกๆท่าน ขียนโปรแก มได้อย่าง ีประสิทธิ าพมากขึ้น ะครับ
คราว ี้จะเป็นเ ื่องการปร บแต่งในส่ นของ Local variable และ Function
call กันบ้างน ะครับ ลองทดลองดู ว่าได้ผลเป ็นยังไงกัน
ก็บอกกล่า กันได้นะค ับผม (^_^)/"
->Minimize Local Variable
หากจำนวน Lacal Variable ในฟังก์ ชันของเราม ีการประกาศ ไว้น้อย compiler สามารถที่จ ะใส่ค่าของ Local
Variable เหล่านั้นไ ว้ใน Register ได้โดยตรง&nb sp;
ซึ่งจะ ป็นการเพิ มประสิทธิ าพอย่างมห ศาลอันเนื องมาจาก
# เนื่องจากค ่าของ
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
ด้วยเม ่อออกจากFunc tion ที่เรียกใช ้งาน)
เป็นการดีก ว่า ถ้าจะจะใช้ การ 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;
Date : 12 June 2007
Language : Thai
ไปไงกันบ้า
->Minimize Local Variable
หากจำนวน Lacal Variable ในฟังก์
# เนื่องจากค
# หากมี Local Variable
-> Declare Local Variables In The Inner Most Scope
ไม่ควรปร
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 ฟังก์ชัน
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 เป็นเร
เป็นการดีก
-> Don't Define A Return Value If Not Used
หาก Function ที่ถูกเรีย
int test(int x)
{ //int N
if(x == 0) return 1;
if(x == 1) return 2;
:
:
// return N;
- Login to post comments
Custom Search
