Raining Season

Optimizing C and C++ code for Embedded System !! episode 2 (Thai language)

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;

Share this page :

Custom Search