我服了,老D ,太厉害了! (0分)

G

GGCAT

Unregistered / Unconfirmed
GUEST, unregistred user!
话说这一日, GGCAT 无所事事,忽然想起那日的一个
过程需要再优化一下。某位大师说过,优化的极至是
用汇编。于是乎,GGCAT 兴致勃勃把一个 16bit RLE
压缩的过程改成了整整齐齐的 MOV ADD XOR CMP....
先运行他 100 次,“起步,走” 3340ms,“不错,
还是汇编了得,看看比原来提高多少? ” GGCAT 展
开Ctrl_C Ctrl_V大法,原来的诗歌般的语句展现面前。
Once Again ,接下来的事情让我目瞪口呆。只有短短
的 2730 ms 。 有没有人相信!!!!
不行,断点看D哥的编译结果。好象比我的罗嗦嘛,查
书,算指令周期,怎么也比他快啊,这是怎么回事!!
我把 Compile 的优化关掉,嘿嘿,总算跑不赢我了。
3570 ms 。可是难道 D5 的编译器有如此的功力。各位
大虾有没有发现过这种现象呢。最后答案即将揭晓:
。。。。。。。
。。。。。。
。。。。
。。。
。。

原来 GGCAT 在那个过程开始曾里使用了两个局部变量,
后来优化后没有使用,但没有去除他们定义。(懒啦)
现在来个 Ctrl-Y ,Test it, 2540 ms。 安心了,可以
去吃饭了。哈哈。
所以说,写汇编子程序不一定快哟,要是不小心,还会
拖后腿呢! 我服了,老D ,太厉害了!
 
这个试验很有意思。
为什么局部变量会影响速度呢?
 
分配局部变量需要时间吧
相当于多执行了几个无效的指令
 
奇怪奇怪,今天晚上我来个现场恢复,就再没有出现慢的现象。
另外,虽然在测试中 成绩差不多,但在实际应用中采用汇编的
过程要流畅得多。奇怪奇怪
 
<font color=red>但在实际应用中采用汇编的过程要流畅得多</font>是什么意思呢?
 
同样每秒压缩 10 frame ,Pascal CPU loader 55%
ASM CPU loader 40% 且手感极佳,
 
呵呵,
真是有空,
不过差别应该是不大的,
我觉得如果真的有较大的差别,
可能是因为分页的原因吧(推想的)
在windows中内存的管理是分页管理的,
如果所有运行时所有的代码段及数据段所需页面都已调入内存,
自然十分流畅,
如果正好多了几个字节,就多了一页,而此时又因此页发生了缺页的情况,
自然得为了区区几个字节进行页面的切换,
这样就影响了程序运行的流畅了。
 
MMX指令???
 
哦,这里还有汇编高手阿!
请教一下,如何用delphi调用另一个程序的指针数据,
我现在只能做到查询另一个程序的内存的数据,知道了指针的偏移,如何取得相应的数据呢?
push esi
mov esi, ecx
push dword ptr [esi+000000F4] ;获得对象的数据结构首址
push dword ptr [esi+000000B0]
call 0045D2CA
xor ecx, ecx
cmp eax, ecx ;是否成功,非零就成功
je 00425188 ;失败转
jmp 004D1640
.......//以下为源程序中取得数据并放入$4d1720处!
push dword ptr [eax+00000218] ;对象1的地址
push dword ptr [eax+00000214] ;对象1字符串指针
push 004D1720 ;缓存地址
push 004D1700
mov esi, dword ptr [0049CE32]
call dword ptr [esi]
add esp, 00000010
pop esi
pop edx
pop ecx
pop eax
cmp dword ptr [eax+000001DC], ecx
mov esp, ebx
jmp 0042515D




 
接受答案了.
 
顶部