Sorting 代码优化提示:
我使用以下ASM例程对数组进行冒泡排序。我想知道我的代码效率低下:Sorting 代码优化提示:,sorting,assembly,masm,masm32,Sorting,Assembly,Masm,Masm32,我使用以下ASM例程对数组进行冒泡排序。我想知道我的代码效率低下: .386 .model flat, c option casemap:none .code public sample sample PROC ;[ebp+0Ch]Length ;[ebp+08h]Array push ebp
.386
.model flat, c
option casemap:none
.code
public sample
sample PROC
;[ebp+0Ch]Length
;[ebp+08h]Array
push ebp
mov ebp, esp
push ecx
push edx
push esi
push eax
mov ecx,[ebp+0Ch]
mov esi,[ebp+08h]
_bubbleSort:
push ecx
push esi
cmp ecx,1
je _exitLoop
sub ecx,01h
_miniLoop:
push ecx
mov edx,DWORD PTR [esi+4]
cmp DWORD PTR [esi],edx
ja _swap
jmp _continueLoop
_swap:
lodsd
mov DWORD PTR [esi-4],edx
xchg DWORD PTR [esi],eax
jmp _skipIncrementESI
_continueLoop:
add esi,4
_skipIncrementESI:
pop ecx
loop _miniLoop
_exitLoop:
pop esi
pop ecx
loop _bubbleSort
pop eax
pop esi
pop edx
pop ecx
pop ebp
ret
sample ENDP
END
基本上,我有两个循环,和气泡排序算法一样。外环的ecx值为10,内环的ecx值为[ecx-1]。我已经尝试过该例程,它编译并运行成功,但我不确定它是否有效。可以做几件事来加快汇编代码的速度:
- 不要做像
。只需执行jbe标签2即可jalabel_1;jmp标签2
是一条非常慢的指令<代码>十二月ebx;jnz loopstart的速度要快得多循环
- 使用所有寄存器,而不是重复推/弹出ecx和esi。也使用
和ebx
edi
- jmp目标应该很好地对齐。在两个循环开始之前和在
jbe之后使用
align 4
cmp DWORD PTR [esi],edx ;// takes some time to compute,
mov edx,DWORD PTR [esi+4] ;
ja _swap ;// waits for results of cmp
3) 避免使用旧的复合指令(dec
,jnz
对比loop
快,并且不绑定到ecx
寄存器)
编写汇编代码要比优化C编译器生成的代码快,因为要考虑很多因素:数据大小和指令缓存、对齐、流水线、指令时序。你可以找到一些很好的文档。我特别推荐第一本书:《C++中的优化软件》如果我们不需要此指令的标志,请将其替换为“添加esi,4”:
_continueLoop:
lea esi,[esi+4]
你知道气泡排序在效率上是一个糟糕的排序算法吗?如果要使用二次时间排序算法,深入到汇编程序级别有什么意义(除了提供一个不应该做什么的示例之外)?任何其他的低效率都与使用bubblesort的简单事实相形见绌。在汇编中实现bubblesort(非常正确)是一个典型的例子,它会做完全错误的事情,并将时间浪费在微观优化错误的算法上。当我读到你在汇编中实现了bubble排序时,我真的很开心。好了,伙计们,我知道bubble排序效率不高。我不是说算法。我在问您是否以高效的方式编写ASM。我现在正在学习组装,而不是做一些项目。我只是想了解一下如何使用寄存器之类的东西。我重复一遍,这与冒泡排序算法无关。无论如何,谢谢你的回复!投票结束,因为太本地化了。为一个人的汇编代码众包优化编译器并不是一项普遍感兴趣的活动。