今天分析了一個C++Bulider (Delphi)程序的匯編代碼,發現了提高代碼效率的一個小竅門,希望能給C++Builder和Delphi程序員做代碼優化的時候提供一點參考。
匯編代碼是這樣的:
一開始判斷一個文本框的輸入字符是否為空,匯編代碼裡面有:
00456DAB |. 8D55 E4 LEA EDX,DWord PTR SS:[EBP-1C]
00456DAE |. 8B45 FC MOV EAX,DWord PTR SS:[EBP-4]
00456DB1 |. 8B80 CC020000 MOV EAX,DWord PTR DS:[EAX+2CC]
00456DB7 |. E8 90CAFCFF CALL Crackme1.0042384C //調用GetDlgItemText
00456DBC |. 8B45 E4 MOV EAX,DWord PTR SS:[EBP-1C]
00456DBF |. E8 08CDFAFF CALL Crackme1.00403ACC //調用strlen函數
00456DC4 |. 85C0 TEST EAX,EAX
00456DC6 |. 0F8E F7010000 JLE Crackme1.00456FC3
接下來,將它與另外一個字符串相連
00456DCF |. 8B45 FC MOV EAX,DWord PTR SS:[EBP-4]
00456DD2 |. 8B80 CC020000 MOV EAX,DWord PTR DS:[EAX+2CC]
00456DD8 |. E8 6FCAFCFF CALL Crackme1.0042384C
~~~~~//這裡,我們發現又調用了一次GetDlgItemText
00456DDD |. 8B55 E4 MOV EDX,DWord PTR SS:[EBP-1C]
00456DE0 |. 8D45 EC LEA EAX,DWord PTR SS:[EBP-14]
00456DE3 |. B9 68704500 MOV ECX,Crackme1.00457068
00456DE8 |. E8 2BCDFAFF CALL Crackme1.00403B18 //調用strcat函數
翻譯成C++Builder代碼(Delphi)應該是:
if(strlen(Edit1->Text) > 0 )
{
strText = Edit1->Text + "ABCDEF" ;
}
如此分析,那麼我們每次用到Edit1->Text都要調用一次GetDlgItemText,
這樣就影響了效率了。
重寫這段代碼我們可以寫成:
str1 = Edit1-Text;
if(strlen(str1)> 0 )
{
str1 = str1 + "ABCDEF"
}
這樣就少了一次GetDlgItemText,的調用,我們知道,每次多CALL一個函數,就要消耗很大開銷,比如現場保存,堆棧操作,以及函數內部的代碼開銷。
相信在Delphi(C++Builder)代碼中,存在大量類似的Edit1->Text操作,這些多余開銷累積起來就相當可觀了,所以我們在編碼過程中稍微改變一下風格,就可以大大提高效率,何樂而不為呢~~ ^_^
Good Luck!