程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 給Delphi/C++Builder程序員:編寫高質量代碼的一個小竅門

給Delphi/C++Builder程序員:編寫高質量代碼的一個小竅門

編輯:Delphi

  今天分析了一個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!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved