You are on page 1of 13

Ti u m ngun C/C++

Ti sao phi ti u m lnh? S ra i ca cc trnh bin dch hin i gip lp trnh vin ci thin ng k thi gian v cng sc pht trin phn mm. Mt vn ng quan tm l xu hng pht trin phn mm theo hng trc quan nhanh v tin dng dn lm mt bng k nng vit m lnh ca cc lp trnh vin gim r rt v h trng cy hon ton vo s h tr ca trnh bin dch. Khi pht trin mt h thng phn mm c tn sut x l cao, v d cc sn phm c chc nng iu phi hot ng dy chuyn sn xut trong nh my, th bn cnh s h tr ca mt trnh bin dch mnh cn cn n k nng ti u m lnh ca lp trnh vin. K nng tt s bin cng vic lp trnh kh khan, vi cc on code tng chng lnh lng tr nn sinh ng. Mt on m lnh tt s tn dng ti a u im ca ngn ng v kh nng x l ca h thng, t gip nng cao ng k hiu sut hot ng ca h thng. chng trnh hot ng ti u, iu u tin l tn dng nhng h tr sn c ca trnh bin dch thng qua cc ch th (directive) gip ti u m lnh, tc v kch thc chng trnh. Hu ht cc trnh bin dch ph bin hin nay u h tr tt vic ti u m khi bin dch. Tuy nhin, t c hiu qu tt nht, lp trnh vin cn tp cho mnh thi quen ti u m lnh ngay t khi bt tay vit nhng chng trnh u tay. Bi vit ny trnh by mt s gi rt c bn v kinh nghim thc t ti u trong lp trnh bng ngn ng C/C++. Tinh gin cc biu thc ton hc Cc biu thc ton hc phc tp khi c bin dch c th sinh ra nhiu m d tha lm tng kch thc v chm tc thc hin ca chng trnh. Do khi vit cc biu thc phc tp lp trnh vin cn nh mt s c im c bn sau gip tinh gin biu thc: - CPU x l cc php tnh cng v tr nhanh hn cc php tnh chia v nhn. V d: + Biu thc Total = (A*B + A*C + A*D) cn 2 php cng v 3 php nhn. Ta c th nhm cc php cng v vit thnh Total = A*(B+C+D), tc tnh nhanh hn v gim i mt php tnh nhn. + Biu thc Total = (B/A + C/A) cn 2 php chia c th vit thnh Total = (B+C)/A, gip gim i mt php chia. - CPU x l tnh ton vi cc s nguyn (integer) chm hn vi s thc (float, double), v tc x l float nhanh hn double. - Trong mt s trng hp nhn hoc chia s nguyn, s dng ton t di bit (bit shifting) s nhanh hn ton t nhn chia. V d:

Biu thc (A *= 128) c th tn dng ton t di bit sang tri thnh (A <<= 7). Mt s trnh bin dch c kh nng ti u m khi bin dch nh Visual C++ 6 hoc .Net 2003, biu thc (A *= 128) v (A <<= 7) u c bin dch thnh:
mov eax, A shl eax, 7 (ton t shl c dng thay v mul/imul) mov A, eax

Ta c th ti u bng cch s dng m assembly trc tip trong m C/C++ nh sau (xem thm th thut tn dng th mnh ca C/C++ bn di):
__asm shl A, 7;

Ti u vic s dng bin tm i vi mt s biu thc tnh ton s hc phc tp, trnh bin dch thng to cc bin tm trong b nh cha kt qu tnh ton v cui cng mi gn gi tr ny cho bin kt qu. Vic s dng bin tm lm gim tc tnh ton do phi cp pht vng nh, tnh ton v thc hin vic gn kt qu cui cng. trnh vic s dng bin tm, ta c th thc hin vic tch cc biu thc phc tp thnh cc biu thc nh hn, hoc s dng cc mo cho vic tnh ton. Xem mt v d cng cc s nguyn sau:
A = B + C

V c bn, khi thc hin biu thc ny trnh bin dch to mt bin tm ri thc hin cng 2 gi tr B, C vo bin tm ny, cui cng s gn kt qu cho A. Ta c th vit li biu thc trn nh sau trnh s dng bin tm lm chm vic tnh ton:
A = B; A += C;

Trong lp trnh hng i tng, theo thi quen i khi lp trnh vin s dng cc bin tm khng cn thit nh trong v d sau:
int MyFunc(const MyClass &A) { MyClass B; B = A; return B.value; }

Trong hm trn, khi bin tm B kiu MyClass c khi to th constructor mc nh s c thc hin. Sau B c gn gi tr ca bin A thng qua vic s dng ton t =, khi copy constructor s c gi. Tuy nhin vi yu cu ca bi ton th vic ny khng cn thit, ta c th vit li nh sau:
int MyFunc(const MyClass &A) { return A.value; }

Di y l mt v d khc cho bi ton hon v gi tr 2 s nguyn A v B. Thng thng, yu cu ny s c vit nh sau:


int A = 7, B = 8; int nTemp; //bin tm nTemp = A; A = B; B = nTemp;

Tuy nhin, bn c th s dng mo sau trnh s dng bin tm v tng tc tnh ton: + S dng ton t XOR:
A = A^B; B = A^B; A = A^B;

+ S dng php cng, tr


nX = nX + nY; nY = nX - nY; nX = nX - nY;

Bn hy chy th on m lnh trn s thy iu bt ng th v khi bi ton hon v c gii quyt ht sc n gin. Th thut trnh s dng bin tm cn p dng linh ng ty thuc kiu d liu, c bit cc loi d liu phc tp nh kiu structure, string... c c ch lu tr v x l ring. i vi cc trnh bin dch hin i, vic ti u theo cch ny i khi khng cn thit v trnh bin dch h tr sn c ch ti u ny khi bin dch m lnh. Ti u cc biu thc iu kin v lun l

Biu thc iu kin l thnh phn khng th thiu hu ht cc chng trnh my tnh v n gip lp trnh vin biu din v x l c cc trng thi ca th gii thc di dng cc m lnh my tnh. Nhng iu kin d tha c th lm chm vic tnh ton v gia tng kch thc m lnh, thm ch c nhng on m c xc sut xy ra rt thp. Mt trong nhng tiu ch quan trng ca vic ti u cc biu thc iu kin l a cc iu kin c xc sut xy ra cao nht, tnh ton nhanh nht ln u biu thc. i vi cc biu thc lun l, ta c th linh ng chuyn cc biu thc iu kin n gin v xc sut xy ra cao hn ln trc, cc iu kin kim tra phc tp ra sau. V d: Biu thc logic ((A || B ) && C ) c th vit thnh (C && ( A || B )) v iu kin C ch cn mt php kim tra TRUE, trong khi iu kin (A || B) cn n 2 php kim tra TRUE v mt php OR (||). Nh vy trong trng hp C c gi tr FALSE, biu thc logic ny s c kt qu FALSE v khng cn kim tra thm gi tr (A || B). i vi cc biu thc kim tra iu kin phc tp, ta c th vit o ngc bng cch kim tra cc gi tr cho kt qu khng tho trc, gip tng tc kim tra. V d: Kim tra mt gi tr thuc mt min gi tr cho trc.
if (p <= max && p >= min && q <= max && q >= min) { //thc hin khi tho min gi tr } else //khng tho { //thc hin khi khng tho min gi tr }

C th vit thnh:
if (p > max || p < min || q > max || q < min) { } else { }

Trnh cc tnh ton lp li trong biu thc iu kin V d:

if ((mydata->MyFunc() ) < min) { // ... } else if ((mydata->MyFunc() ) > max) { // ... }

Ta c th chuyn hm MyFunc ra ngoi biu thc iu kiu nh sau:


int temp_value = mydata->MyFunc(); if (temp_value < min) { // ... } else if (temp_value > max) { // ... }

i vi biu thc iu kin dng switch...case: nu cc gi tr cho case lin tc nhau, trnh bin dch s to ra bng nh x (cn gi l jump table) gip vic truy xut n tng iu kin nhanh hn v gim kch thc m lnh. Tuy nhin khi cc gi tr khng lin tc, trnh bin dch s to mt chui cc php ton so snh, t gy chm vic x l: V d sau cho kt qu truy xut ti u khi s dng switch...case:
switch (my_value) { case A: ... break; case B: ... break; case C: ... break; case D: ... default:

... }

Trong trng hp cc gi tr dng cho case khng lin tc, ta c th vit thnh cc biu thc if...elseif...else nh sau:
switch (my_value) { case A: ... break; case F: ... break; case T: } C th vit thnh: if (my_value == A) { // x l cho trng hp A } else if (my_value == F) { // x l cho trng hp F } else { // cc trng hp khc }

Ti u vng lp Vng lp cng l mt thnh phn c bn phn nh kh nng tnh ton khng mt mi ca my tnh. Tuy nhin, vic s dng my mc vng lp l mt trong nhng nguyn nhn lm gim tc thc hin ca chng trnh. Mt s th thut sau s gip lp trnh vin tng tc vng lp ca mnh: - i vi cc vng lp c s ln lp nh, ta c th vit li cc biu thc tnh ton m khng cn dng vng lp. Nh vy tit kim c khong thi gian qun l v tng bin m trong vng lp. V d cho vng lp sau:
for( int i = 0; i < 4; i++ ) { array[i] =MyFunc(i); } c th vit li thnh: array[0] = MyFunc(0); array[1] = MyFunc(1);

array[2] = MyFunc(2); array[3] = MyFunc(3);

- i vi cc vng lp phc tp c s ln lp ln, cn hn ch vic cp pht cc bin ni b v cc php tnh lp i lp li bn trong vng lp m khng lin quan n bin m lp. V d cho vng lp sau:
int students_number = 10000; for( int i = 0; i < students_number; i++ ) { //hm MyFunc mt nhiu thi gian thc hin double sample_value = MyFunc(students_number); CalcStudentFunc(i, sample_value); }

Trong v d trn, bin sample_value c tnh mi vng lp mt cch khng cn thit v hm MyFunc c th tn rt nhiu thi gian, ta c th di on m tnh ton ny ra ngoi vng lp nh sau:
int students_number = 10000; double sample_value = MyFunc(students_number); for( int i = 0; i < students_number; i++ ) { CalcStudentFunc(i, sample_value); }

- i vi vng lp t 0 n n phn t nh sau:


for( int i = 0; i < max_number; i++ )

Nn thc hin vic lp t gi tr max_number tr v 0 nh sau:


for( int i = max_number - 1; i >=0 ; -- i )

V khi bin dch thnh m my, cc php so snh vi 0 (zero) s c thc hin nhanh hn vi cc s nguyn khc. Do php so snh mi vng lp l ( i >=0 ) s nhanh hn php so snh ( i < max_number). - Trong vng lp ln, cc ton t prefix dng (--i hoc ++i) s thc hin nhanh hn ton t postfix (i-- hoc i++). Nguyn nhn l do ton t prefix tng gi tr ca bin

trc sau tr kt qu v cho biu thc, trong khi ton t postfix phi lu gi tr c ca bin vo mt bin tm, tng gi tr ca bin v tr v gi tr ca bin tm. Ti u vic s dng b nh v con tr Con tr (pointer) c th c gi l mt trong nhng "nim t ho" ca C/C++, tuy nhin thc t n cng l nguyn nhn lm au u cho cc lp trnh vin, v hu ht cc trng hp sp h thng, ht b nh, vi phm vng nh... u xut pht t vic s dng con tr khng hp l. - Hn ch pointer dereference: pointer dereference l thao tc gn a ch vng nh d liu cho mt con tr. Cc thao tc dereference tn nhiu thi gian v c th gy hu qu nghim trng nu vng nh ch cha c cp pht. V d vi on m sau:
for( int i = 0; i < max_number; i++ ) { SchoolData->ClassData->StudentData->Array[i] = my_value; }

Bng cch di chuyn cc pointer dereference nhiu cp ra ngoi vng lp, on m trn c th vit li nh sau:
unsigned long *Temp_Array = SchoolData->ClassData->StudentData>Array; for( int i = 0; i < max_number; i++ ) { Temp_Array[i] = my_value; }

- S dng tham chiu (reference) cho i tng d liu phc tp trong cc tham s hm. Vic s dng tham chiu khi truyn nhn d liu cc hm c th gip tng tc ng k i vi cc cu trc d liu phc tp. Trong lp trnh hng i tng, khi mt i tng truyn vo tham s dng gi tr th ton b ni dung ca i tng s c sao chp bng copy constructor thnh mt bn khc khi truyn vo hm. Nu truyn dng tham chiu th loi tr c vic sao chp ny. Mt im cn lu khi s dng tham chiu l gi tr ca i tng c th c thay i bn trong hm gi, do lp trnh vin cn s dng thm t kha const khi khng mun ni dung i tng b thay i. V d: Khi truyn i tng dng gi tr vo hm s dng, copy constructor s c gi.
void MyFunc(MyClass A) //copy constructor ca A s c gi {

int value = A.value; }

Khi dng dng tham chiu, on m trn c th vit thnh:


void MyFunc(const MyClass &A) //khng gi copy constructor { int value = A.value; }

- Trnh phn mnh vng nh: Tng t nh vic truy xut d liu trn a, hiu nng truy xut cc d liu trn vng nh ng s gim i khi b nh b phn mnh. Mt s gi sau s gip gim vic phn mnh b nh. + Tn dng b nh tnh. V d: nh tc truy xut vo mt mng tnh c tc nhanh hn truy xut vo mt danh sch lin kt ng. + Khi cn s dng b nh ng, trnh cp pht hoc gii phng nhng vng nh kch thc nh. V d nh ta c th tn dng xin cp pht mt mng cc i tng thay v tng i tng ring l. + S dng STL container cho cc i tng hoc cc c ch s dng b nh ring c kh nng ti u vic cp pht b nh. STL cung cp rt nhiu thut ton v loi d liu c bn gip tn dng ti a hiu nng ca C++. Cc bn c th tm c cc sch v STL s bit thm nhiu iu th v. - Sau khi cp pht mt mng cc i tng, trnh nhm ln khi s dng ton t delete[] v delete: vi C++, ton t delete[] s ch nh trnh bin dch xa mt chui cc vng nh, trong khi delete ch xa vng nh m con tr ch n, do c th gy hin tng "rc" v phn mnh b nh. V d:
int *myarray = new int[50]; delete []myarray;

Vi delete[], trnh bin dch s pht sinh m nh sau:


mov ecx, dword ptr [myarray] mov dword ptr [ebp-6Ch], ecx mov edx, dword ptr [ebp-6Ch] push edx call operator delete[] (495F10h) //gi ton t delete[] add esp,4

Trong khi vi on lnh:


int *myarray = new int[50]; delete myarray;

Trnh bin dch s pht sinh m nh sau:


mov ecx, dword ptr [myarray] mov dword ptr [ebp-6Ch], ecx mov edx, dword ptr [ebp-6Ch] push edx call operator delete (495F10h) //gi ton t delete add esp,4

S dng hp l c ch by li try...catch Vic s dng khng hp l cc by li c th l sai lm tai hi v trnh bin dch s thm cc m lnh kim tra cc on m c ci t try...catch, iu ny lm tng kch thc v gim tc x l ca chng trnh, ng thi gy kh khn trong vic sa cha cc li logic. Thng k cho thy cc on m c s dng by li th hiu xut thc hin gim t 5%-10% so vi on m thng thng c vit cn thn. hn ch iu ny, lp trnh vin ch nn t by li nhng on m c nguy c li cao v kh nng d bo trc thp. Tn dng c tnh x l ca CPU m bo tc truy xut ti u, cc b vi x l (CPU) 32-bit hin nay yu cu d liu sp xp v tnh ton trn b nh theo tng offset 4-byte. Yu cu ny gi l memory alignment. Do vy khi bin dch mt i tng d liu c kch thc di 4byte, cc trnh bin dch s b sung thm cc byte trng m bo cc d liu c sp xp theo ng quy lut. Vic b sung ny c th lm tng ng k kch thc d liu, c bit i vi cc cu trc d liu nh structure, class... Xem v d sau:
class Test { bool a; int c; int d; bool b; };

Theo nguyn tc alignment 4-byte (hai bin "c" v "d" c kch thc 4 byte), cc bin "a" v "b" ch chim 1 byte v sau cc bin ny l bin int chim 4 byte, do trnh bin dch s b sung 3 byte cho mi bin ny. Kt qu tnh kch thc ca lp Test bng hm sizeof(Test) s l 16 byte. Ta c th sp xp li cc bin thnh vin ca lp Test nh sau theo chiu gim dn kch thc:
class Test { int c; int d; bool a; bool b; };

Khi , hai bin "a" v "b" chim 2 byte, trnh bin dch ch cn b sung thm 2 byte sau bin "b" m bo tnh sp xp 4-byte. Kt qu tnh kch thc sau khi sp xp li class Test s l 12 byte. Tn dng mt s u im khc ca C++ - Khi thit k cc lp (class) hng i tng, ta c th s dng cc phng thc "inline" thc hin cc x l n gin v cn tc nhanh. Theo thng k, cc phng thc inline thc hin nhanh hn khong 5-10 ln so vi phng thc c ci t thng thng. - S dng ngn ng cp thp assembly: mt trong nhng u im ca ngn ng C/C++ l kh nng cho php lp trnh vin chn cc m lnh hp ng vo m ngun C/C++ thng qua t kha __asm { ... }. Li th ny gip tng tc ng k khi bin dch v khi chy chng trnh. V d:
int a, b, c, d, e; e = a*b + a*c;

Trnh bin dch pht sinh m hp ng nh sau:


mov eax, dword ptr [a] imul eax, dword ptr [b] mov ecx, dword ptr [a] imul ecx, dword ptr [c]

add eax, ecx mov dword ptr [e], eax

Tuy nhin, ta c th vit rt gn gim c 1 php imul (nhn), 1 php mov (di chuyn, sao chp):
__asm { mov eax, b; add eax, c; imul eax, a; mov e, eax; };

- Ngn ng C++ cho php s dng t kha "register" khi khai bo bin lu tr d liu ca bin trong thanh ghi, gip tng tc tnh ton v truy xut d liu trong thanh ghi lun nhanh hn truy xut trong b nh. V d:
for (register int i; i <max_number; ++i ) { // x l trong vng lp }

- Ngn ng C/C++ h tr cc collection rt mnh v tc truy xut nh cc bng map, hash_map,... nn tn dng vic s dng cc kiu d liu ny thay cho cc danh sch lin kt b nh ng (linked list). Kt lun Mt chng trnh c nh gi tt khi tt c cc b phn tham gia vo hot ng ca chng trnh t hiu sut cao nht theo yu cu ca ngi s dng. Mt dng lnh n gin tng chng s hot ng trong tch tc c th lm h thng tr nn chm chp khi c gi hng ngn, hng triu ln trong khong thi gian ngn. Do vy, trong sut qui trnh hnh thnh sn phm phn mm, giai on ci t m lnh chim vai tr ht sc quan trng v cn k nng ti u ha cao nht. t c iu , khng cch no khc hn l lp trnh vin cn t rn luyn tht nhiu thng tho ngn ng mnh chn la, trnh bin dch mnh s dng. Khi lp trnh khng cn l vic to nhng on m kh khan, m l mt ngh thut. Nguyn Vn Sn

Global CyberSoft Vietnam sonnv@cybersoft-vn.com

You might also like