VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)

VB爱好者乐园(VBGood)

 找回密码
 立即注册
搜索
查看: 19880|回复: 106

还能优化吗?

[复制链接]
 楼主| 发表于 2009-2-5 13:59:19 | 显示全部楼层 |阅读模式
插入排序法
  1. BRANCH_TAKEN MACRO
  2.                 DB 3EH
  3. ENDM

  4. BRANCH_NOT_TAKEN MACRO
  5.                 DB 2EH
  6. ENDM

  7. MAX_BYTE        EQU     0FFH

  8. ;EBX:POINTER TO ARRAY
  9. ;ECX:ARRAY LENGTH
  10. INSERTIONSORT   PROC
  11.                 LEA     ESI,[EBX+ECX]
  12.                 PUSH    DWORD PTR [ESI]
  13.                 PUSH    ESI
  14.                 MOV     BYTE PTR [ESI],MAX_BYTE
  15.                
  16.                 SUB     ECX,2
  17.                
  18. LOOP1:          LEA     ESI,[EBX+ECX]
  19.                 MOV     AL,[ESI]
  20.                 JMP     LOOP2ENTRY
  21.                
  22. LOOP2:          MOV     [ESI],DL
  23.                 ADD     ESI,1
  24. LOOP2ENTRY:     MOV     DL,[ESI+1]
  25.                 CMP     AL,DL
  26. ENDLOOP2:       JA      LOOP2
  27.                
  28.                 MOV     [ESI],AL
  29.                
  30.                 SUB     ECX,1
  31.                 BRANCH_TAKEN
  32. ENDLOOP1:       JNC     LOOP1
  33.                
  34.                 POP     ESI
  35.                 POP     DWORD PTR [ESI]
  36.                 RET
  37. INSERTIONSORT   ENDP
复制代码

评分

参与人数 2人气 +2 收起 理由
PctGL + 3 为什么要给人家扣分
410023425 -1 其实你应该发到"其他语言版块"

查看全部评分

发表于 2009-2-5 14:07:46 | 显示全部楼层
汇编厄...
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-2-5 14:24:42 | 显示全部楼层
是的...
回复 支持 反对

使用道具 举报

发表于 2009-2-5 17:07:00 | 显示全部楼层
为什么 SUB     ECX,1 而不是 dec ecx?

还有就是那个BRANCH_TAKEN “3E”是什么汇编指令?还有那个数组除了长度为Length以外还要附加4字节的额外长度,是不是临时变量啊?如果临时变量不用复原的话那么Push和Pop好像都可以省略吧……

[ 本帖最后由 acme_pjz 于 2009-2-5 17:14 编辑 ]
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-2-5 17:48:06 | 显示全部楼层
sub ecx,1比dec ecx快。
branch_taken是指令前缀,告诉cpu如何预测分支。
那个不是临时变量..是减少分支的一个小技巧..
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-2-5 18:27:04 | 显示全部楼层
原来每个循环需要检测2次:比较大小和是否到最后一个元素

  1. Do
  2. ...
  3. If j=num Then Exit Do
  4. Loop While tmp>data(j+1)
复制代码

现在在数组最后加了一个255,是最大的byte
因此如果比较到最后一个就会停下来,因为任何byte都不会比255大

  1. Do
  2. ...
  3. Loop While tmp>data(j+1)
复制代码

每次循环减少了一次判断,减少一个分支,而且这个分支不好预测(如果数组是排序好的则每次都不分支,如果数组是倒序则每次都分支)
回复 支持 反对

使用道具 举报

发表于 2009-2-5 18:40:49 | 显示全部楼层
照你的思路也一定说 add 比 inc 快了。。。
还有比 inc,dec 更快的指令吗...

分支预测是基于cpu内部的状态标志,你的那个宏,说是技巧从哪里来的呢?
分支预测的是基于概率的,并不依赖某个指令的影响,jmp 指令同样执行分支预测

[ 本帖最后由 PctGL 于 2009-2-5 18:59 编辑 ]
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-2-5 19:28:00 | 显示全部楼层
不是指令..是前缀..intel的官方文档说的

add确实比inc快,因为inc不改变carry flag,可能会导致对前一个指令的错误依赖(false dependent)
add一个时钟周期可以执行4个,inc只能有2个

agner fog的intel优化指南:

[ 本帖最后由 littlekevin 于 2009-2-5 19:34 编辑 ]

fog.pdf

795.81 KB, 下载次数: 990

回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-2-5 19:33:18 | 显示全部楼层
intel官方文档,看第34页

Intel Instruction Set.part1.rar

1.91 MB, 下载次数: 1178

Intel Instruction Set.part2.rar

1.91 MB, 下载次数: 1188

Intel Instruction Set.part3.rar

1.91 MB, 下载次数: 1135

Intel Instruction Set.part4.rar

524.28 KB, 下载次数: 1041

回复 支持 反对

使用道具 举报

发表于 2009-2-5 20:00:47 | 显示全部楼层
第3章第34页? adc 那页?
没看到哪写着占用时钟周期的长度呢?

我发现语言学的xx了:

》add确实比inc快,因为inc不改变carry flag,可能会导致对前一个指令的错误依赖(false dependent)
inc 就是因为不影响标志位,所以对他本身的执行效率来讲也是有所增强的,而且很多时候我们需要的就是不影响标志位的操作,能被你解释成错误依赖。。。。

》add一个时钟周期可以执行4个,inc只能有2个
完全错误的说法
你对指令占用cpu时钟周期的理解正好颠倒了...而且怎么感觉你对80486的cpu不熟悉的样子

[ 本帖最后由 PctGL 于 2009-2-5 20:03 编辑 ]
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

文字版|手机版|小黑屋|VBGood  

GMT+8, 2023-3-22 05:44

VB爱好者乐园(VBGood)
快速回复 返回顶部 返回列表