标题:VB代码执行效率问题:abs(负数) 与 0-负数,那条语句执行更快?
只看楼主
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4912
专家分:29900
注 册:2008-10-15
得分:0 
0-负数,就是一条指令
neg ebx                                                 ; 求补指令,相当于0-这个数
加上判断也就是4条指令
00401C2E   .  3BFE          cmp edi,esi                                             ; 是否小于零
00401C30   .  7D 0A         jge short 00401C3C                                      ; 小于零跳
00401C32   .  8BDF          mov ebx,edi                                             ; EDT到EBX
00401C34   .  F7DB          neg ebx                                                 ; 求补指令,相当于0-这个数

调用 abs 函数
00401CC0   . |FF15 1C104000 call dword ptr [<&MSVBVM60.__vbaI4Abs>]                 ; 调用 abs 函数

里的内容:
CPU Disasm
地址        十六进制数据            汇编代码                                                    注释
72A24D03    56              push esi
72A24D04    8BF1            mov esi,ecx
72A24D06    85F6            test esi,esi                  测试结果
72A24D08    7D 0B           jge short 72A24D15            
72A24D0A    F7DE            neg esi                       也是使用的这个方法 neg
72A24D0C    79 07           jns short 72A24D15            符号位不为1,则跳
72A24D0E    6A 06           push 6
72A24D10    E8 1795FEFF     call 72A0E22C                 又一层调用,靠。不过在这里没有执行,猜是错误处理过程。
72A24D15    8BC6            mov eax,esi
72A24D17    5E              pop esi
72A24D18    C3              retn




授人于鱼,不如授人于渔
早已停用QQ了
2018-05-03 18:06
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4912
专家分:29900
注 册:2008-10-15
得分:0 
结合汇编 分析
在IDE解释执行情况下,
IF命令需要解释再执行
而调用 ABS时,直接执行的DLL里的 机器指令,这步比解释执行要快很多。

所以,在IDE下调用VB内置函数,比自己用实现要快。
但编译后,自己实现的函数,只要优化到位,比调用VB内置函数少了调用时的开销。很可能就更快了。


授人于鱼,不如授人于渔
早已停用QQ了
2018-05-03 18:09
wufuzhang
Rank: 9Rank: 9Rank: 9
来 自:广州
等 级:贵宾
威 望:21
帖 子:206
专家分:1346
注 册:2017-8-9
得分:0 
回复 10楼 风吹过b
大神就是大神,有理有据,讲的很透彻,我自己也测试了,确实是这样。

我们更关注的是编译后的可执行.exe文件的执行效率,因为这个才是客户的体验。

代码少些一句(b=a),函数少调用一个(abs),我们的程序就会跑的更快一点。

PS:CUP Disasm 后面一大串东东在哪里可以看到?

不经历千百遍的调试,怎能体会成功时那一刹那的喜悦。
2018-05-04 11:59
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4912
专家分:29900
注 册:2008-10-15
得分:0 
CUP Disasm 后面一大串东东在哪里可以看到?
用 OllyDbg 看的。

我也很多命令看不懂,后面的注释都是自己输入 的。
VBDebugger 的结果,结果更好看一点,但有时会自己吃掉命令。

授人于鱼,不如授人于渔
早已停用QQ了
2018-05-04 12:42



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-486584-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.876343 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved