Winter Season

Optimizing C and C++ code for Embedded System !! Episode 3 (Thai Language)


Written by :  Ataya P
Date :
30 June 2007
Language : Thai

     มาแล้วครับ !!! สดๆร้อนๆกับการปรับแต่งโค้ดภาษา C  และ C++ สำหรับระบบสมองกลฝังตัว Episode 3 คราวนี้คงทำให้โปรแกรมของใครๆหลายๆคนแรงขึ้นได้อย่างพอสมควร ผมเองก็ได้แต่หวังใจว่าบทความที่เขียนไปนี้จะทำให้ผู้ที่สนใจได้รับความรู้เกี่ยวกับการปรับแต่งซอร์สโค้ดไปใช้งานได้จริงๆไม่มากก็น้อย( อนึ่ง เนื่องจากผมเองก็ไม่ได้เก่งภาษาอังกฤษอะไรมากมาย เวลาที่แปลเว็ปของฝรั่งมาเป็นเป็นภาษาไทยก็อาจจะเข้าใจผิดไปบ้าง ถ้ามีท่านผู้รู้เห็นจุดผิดใดๆก็ช่วยแจ้งมาด้วยนะครับ)  ;p



-> Prefer int over char and short
     
สำหรับภาษา C และ C++ นั้นควรใช้ตัวแปรที่เป็นชนิด int  มากกว่า char หรือ short เนื่องด้วยเหตุผลที่ว่าเมื่อเวลาทำการคอมไพล์แล้วนั้นคอมไพล์เลอร์จะทำการเปลี่ยน char เป็น int ก่อนสำหรับการทำ Arithmetic operation(+,-,*,/,....) และการทำ Parameter passing  ถึงแม้ว่าตัวแปรที่เราอยากจะใช้งานจะไม่มีความจำเป็นต้องมีขนาดใหญ่เท่า int (แค่ byte เดียวก็เพียงพอ)จึงต้องการจะใช้ตัวแปรเป็น char แทน แต่ท้ายที่สุดแล้วเวลาประมวลผลก็ต้องเสียเวลามาเปลี่ยนเป็น int อยู่ดี ดังนั้นเราควรจะใช้ตัวแป int  จนกว่าจำเป็นจะต้องใช้ char หรือ short ในการ storage

       char sum_char(char a,char b)                                                 int  sum_int(int a,int b)
       {   char c;                                                                                        {      int c;
             c=a+b;                                                       ====>                              c=a+b;
             return c;                                                                                             return c;
       }                                                                                                          }



-> Define  lightweight constructors
        เราควรจะกำหนดให้ constructor มีขนาดเล็กที่สุดเท่าที่จะทำได้ เพราะการสร้าง Object ทุกครั้งจะต้องเกี่ยวข้องกับ construcor ทุกครั้ง การทำการปรับแต่ง constructor จะทำให้ได้การทำงานที่เร็วขึ้นมากทีเดียว


-> Prefer initialization over assigment
        เราควรทำการ initial ค่าให้กับตัวแปรมากกว่าการ assign ค่าในภายหลัง 
         
        void foo( )                                                                   void  foo_optimize( )
       {   complex c;                                                              {
            c=(complex) 5;                         ======>                    complex c=5;
        }                                                                                  }
       


->Use constructor initialization list
    ควรใช้  constructor initialization list ในการ initial  ตัวแปร การทำ assignment ไว้ใน constructor body จะทำให้ประสิทธิภาพลดลง
   
     Employee :: Employee(string name,string desig)                     Employee :: Employee(string  name,string desig) :                   
                                                                                                                         m_name(name),m_desig(desig)
                                                     
     {     m_name = name;                                ======>                {
            m_desig=desig;                                                                 }
      }


-> In-line 1 to 3 line functions
     ควรขยาย function ขนาดเล็ก( 1,3 บรรทัด)ให้เป็น function แบบ In-line(เขียนโค้ดตรงๆไม่ต้องเรียกฟังก์ชัน)เพื่อขจัด overhead ของการ call function และ parameter ที่ต้องส่งผ่าน อย่างไรก็ดีการใช้วิธี  in-line function นี้กับฟังก์ชันอื่นๆที่มีขนาดใหญ่อาจให้ผลที่เป็นลบมากกว่า เนื่องจากการเพิ่มขึ้นของโด้ด

      int func(int y)                                                                                                             int func(int y)
     {                                                                                                                                    {  int temp=0;
          return pred(y)+pred(0)+pred(y+1);                                 ======>                                 if(y==0) temp+=0; else temp+y;   
     }                                                                                                                                           :         
                                                                                                                                                  :
                                                                                                                                                  return    temp;
                                                                                                                                            }  





Share this page :

Custom Search