Советы по оптимизации кода: - PullRequest
2 голосов
/ 10 октября 2011

Я использую следующую процедуру 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-1]. Я пробовал эту процедуру, и она успешно компилируется и работает, но я не уверен, что она эффективна.

Ответы [ 3 ]

3 голосов
/ 10 октября 2011

Есть несколько вещей, которые вы можете сделать, чтобы ускорить ваш ассемблерный код:

  • не делайте такие вещи, как ja label_1 ; jmp label_2. Просто сделайте jbe label_2 вместо.

  • loop - очень медленная инструкция. dec ebx; jnz loopstart намного быстрее

  • использовать все регистры вместо многократных push / pop ecx и esi. Используйте ebx и edi тоже.

  • jmp-цели должны быть хорошо выровнены. Используйте align 4 до двух циклов и после jbe

Получите руководство для своего процессора от Intel (вы можете скачать его в формате pdf), у него есть время для кодов операций, возможно, у него есть и другие подсказки.

2 голосов
/ 10 октября 2011

Несколько простых советов:

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 ++

0 голосов
/ 29 января 2014

Заменить на «add esi, 4», если нам не нужен флаг для этой инструкции:

_continueLoop:
            lea esi,[esi+4]
...