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

|