Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 代码优化提示:_Sorting_Assembly_Masm_Masm32 - Fatal编程技术网

Sorting 代码优化提示:

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

我使用以下ASM例程对数组进行冒泡排序。我想知道我的代码效率低下:

.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]。我已经尝试过该例程,它编译并运行成功,但我不确定它是否有效。

可以做几件事来加快汇编代码的速度:

  • 不要做像
    jalabel_1;jmp标签2
    。只需执行jbe标签2即可

  • 循环
    是一条非常慢的指令<代码>十二月ebx;jnz loopstart的速度要快得多

  • 使用所有寄存器,而不是重复推/弹出ecx和esi。也使用
    ebx
    edi

  • jmp目标应该很好地对齐。在两个循环开始之前和在
    jbe之后使用
    align 4

从英特尔为您的cpu准备一本手册(您可以下载为pdf格式),其中有操作码的计时,可能还有其他提示。

几个简单提示:

1) 尽量减少条件跳转的次数,因为它们非常昂贵。如果可能,展开。 2) 重新排序指令,以最大限度地减少因数据依赖而导致的暂停:

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。我现在正在学习组装,而不是做一些项目。我只是想了解一下如何使用寄存器之类的东西。我重复一遍,这与冒泡排序算法无关。无论如何,谢谢你的回复!投票结束,因为太本地化了。为一个人的汇编代码众包优化编译器并不是一项普遍感兴趣的活动。