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;
Custom Search