очередная оптимизация

Тема в разделе "WASM.ASSEMBLER", создана пользователем t00x, 16 дек 2007.

  1. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    оптимизировал тело цикла, критерии: скорость, минимальное количество записей в память и т.д.
    подскажите, может что упустил?
    Код (Text):
    1.     cld             ;
    2. @nextdata:
    3.     mov eax, [esi]          ; data
    4.     mov ecx, [ebp+8]        ;
    5.     add esi, 4          ; dd
    6.     mov edi, [ebp+12]       ;
    7.     repne scasd         ; search in array
    8.  
    9.     sub ecx, [ebp+8]        ;
    10.     mov eax, ecx            ;
    11.     not eax             ; recordXY index
    12.     mov ecx, edx            ; ecx = x
    13.  
    14.     mul dword [ebp-8]       ; recordXY size db
    15.  
    16.     cmp ecx, [ebp+16]       ; x < width
    17.     cmovl edx, ecx          ;
    18.     setnl cl            ;
    19.     and ecx, 1          ;
    20.     add eax, [ebp-4]        ; address current recordXY
    21.  
    22.     add ecx, ebx            ; y = 1? + y
    23.     mov ebx, ecx            ; y
    24.     add ecx, [ebp+16]       ; y + width
    25.  
    26.     add dword [eax + edx*4], 1  ; statistics x
    27.     add dword [eax + ecx*4], 1  ; statistics y
    28.  
    29.     add edx, 1          ; x++
    30.  
    31.     cmp esi, [ebp-12]       ;
    32.     jnz @nextdata           ;
    принимаются все замечания касательно кода :)
     
  2. jecxz

    jecxz New Member

    Публикаций:
    0
    Регистрация:
    23 фев 2006
    Сообщения:
    75
    Адрес:
    Brazil
    Сорри, небольшой оффтопчик.
    Может стоит сделать какую-то общую тему про оптимизацию, куда каждый желающий кидал свой код?
     
  3. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    jecxz
    Жжоте не по-деццки
    "WASM.A&O->Обсуждение алгоритмов и техник оптимизации кода"
     
  4. jecxz

    jecxz New Member

    Публикаций:
    0
    Регистрация:
    23 фев 2006
    Сообщения:
    75
    Адрес:
    Brazil
    Mikl__
    упс, а я и не заметил :)
     
  5. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    t00x
    заменим scasd cmp eax,[edi] тогда вот этот кусок
    Код (Text):
    1.     cld             ;
    2. @nextdata:
    3.     mov eax, [esi]          ; data
    4.     mov ecx, [ebp+8]        ;
    5.     add esi, 4          ; dd
    6.     mov edi, [ebp+12]       ;
    7.     repne scasd         ; search in array
    8.  
    9.     sub ecx, [ebp+8]        ;
    10.     mov eax, ecx            ;
    11.     not eax
    можно заменить на этот
    Код (Text):
    1. @nextdata:
    2.         xor edi,edi
    3.     mov eax, [esi]          ; data
    4.     mov ecx, [ebp+8]        ;
    5.     add esi, 4          ; dd
    6. a0: cmp eax,[edi*4+ebp+12]      ;
    7.     jz a1           ; search in array
    8.         add edi,1
    9.         sub ecx,1
    10.         jnz a0
    11. a1:     mov eax, edi
    12.         mov ecx,edi
     
  6. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    Mikl__
    думал над этим, но array маленькой мощности будет (30-40 элементов)
     
  7. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    t00x
    1) если array мелкий т.е. ecx<256 тогда and ecx,1 лишнее
    2) флаг DF=0 при старте программы под WinNT, если его внутри программы не меняешь, тогда и cld тоже лишний
     
  8. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    Mikl__
    попробую изменить формат структуры recordXY, на recordX...X,recordY...Y, меньше кода получится.
    по 1) 30-40 < 256 - предположительно;
    2) спасибо, не знал.
     
  9. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    t00x
    1) наверное можно and ecx,1 заменить на movzx ecx,cl
    2) поиск минимума cmp ecx, [ebp+16]/cmovl edx, ecx/setnl cl можно заменить на
    Код (Text):
    1.   sub ecx,[ebp+16]
    2.   sbb edi,edi
    3.   and ecx,edi
    4.   add ecx,[ebp+16]
    5.   mov edx,ecx
    6.   setnc cl
     
  10. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    довёл до такого:
    Код (Text):
    1.         mov edi, [ebp+12]               ;
    2. @nextdata:
    3.         mov edx, [esi]                  ; data
    4.         xor eax, eax                    ;
    5.         add esi, 4                      ; dd
    6. @@:     cmp edx, [edi + eax*4]          ;
    7.         je @f                           ;
    8.         add eax, 1                      ;
    9.         jmp @b                          ;
    10. @@:
    11.         mul dword [ebp-8]               ; recordXY size db
    12.  
    13.         cmp ecx, [ebp+12]               ; x < width
    14.         cmovge ecx, edx                 ;
    15.         setge dl                        ;
    16.         add eax, [ebp-4]                ; address current recordXY
    17.  
    18.         add edx, ebx                    ; y = 1? + y
    19.         mov ebx, edx                    ; y
    20.         add edx, [ebp+12]               ; y + width
    21.  
    22.         add dword [eax + ecx*4], 1      ; statistics x
    23.         add dword [eax + edx*4], 1      ; statistics y
    24.  
    25.         add ecx, 1                      ; x++
    26.  
    27.         cmp esi, [ebp-12]               ;
    28.         jnz @nextdata                   ;
    убрал медленную repne scasd и вынес из цикла mov edi, [ebp+12], также немного перераспределил регистры.
    зачем?, быстрее не будет.
     
  11. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    t00x
    А какой алгоритм Вы оптимизируете?
     
  12. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    Mikl__
    алго подсчитывает мощность распределения значений элементов из array на двумерном? пространстве.
     
  13. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
  14. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    Mikl__
    близко. было решено везде использовать как минимум 32 разрядные данные для дальнейшей совместимости
     
  15. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    mul dword [ebp-8] ; recordXY size db
    подозреваю, что это умножение на константу, если да тогда разумно через таблицу
    lea ebx,table[ebp-8]/lea eax,[ebx+eax*4]
    в аттаче примеры скоростного умножения
     
  16. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    Mikl__
    память дешевеет настолько быстро, что думал над дополнением [ebp-8] до степени двойки и сдвиге, соответственно придётся чуть больше памяти выделять ;)

    P.S. спасибо, интересный файл )