Assembler vs GNU standard lib

Huvikseni yritin disassmbloida gligc-2.28:n strlen rutiinia ja sain puristettua
ulos alla olevan intel-syntaxisen ja NASM:lla käännettävän (nasm -felf64 ...) koodin siitä.
Sitten testasin tätä (nasm'lla tuotettua) koodia linkitettynä staattisesti sitä kutsuvaan
C-koodiin ja vertasin tulosta standard C strlen kutsuihin....

; Tämä ON glibc strlen vieläpä hieman optimoituna,
; eli ei stack-framea ja poistettu kaksi if lausetta.

global as_strlen
section .text

as_strlen:
mov r9, rdi
test dil, 7
je addr_c
cmp BYTE [rdi], 0
jne addr_b
jmp addr_o
addr_a: cmp BYTE [rdi], 0
je addr_g
addr_b: inc rdi
test dil, 7
jne addr_a
addr_c: mov r8, 0xfefefefefefefeff
mov rsi, 0x8080808080808080
jmp addr_f
addr_d: cmp BYTE [rdx-7], 0
je addr_i
cmp BYTE [rdx-6], 0
je addr_j
cmp BYTE [rdx-5], 0
je addr_k
cmp BYTE [rdx-4], 0
je addr_l
cmp BYTE [rdx-3], 0
je addr_m
cmp BYTE [rdx-2], 0
je addr_n
cmp BYTE [rdx-1], 0
je addr_o
addr_e: mov rdi, rdx
addr_f: lea rdx, [rdi 0x8]
mov rax, QWORD [rdx-8]
lea rcx, [rax r8]
not rax
and rax, rcx
test rax, rsi
je addr_e
cmp BYTE [rdx-8], 0
jne addr_d
addr_g: mov rax, rdi
sub rax, r9
ret
xor eax, eax
ret
addr_i: sub rdi, r9
lea rax, [rdi 1]
ret
addr_j: sub rdi, r9
lea rax, [rdi 2]
ret
addr_k: sub rdi, r9
lea rax, [rdi 3]
ret
addr_l: sub rdi, r9
lea rax, [rdi 4]
ret
addr_m: sub rdi, r9
lea rax, [rdi 5]
ret
addr_n: sub rdi, r9
lea rax, [rdi 6]
ret
addr_o: sub rdi, r9
lea rax, [rdi 7]
ret

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Ja mitä olivat tulokset?

glibc strlen voitti tämän rutiinin, eli se oli ~ 3-4% nopeampi kuin tämä
vaikka tämä koodi on melkein suora disassembly kyseisestä glibc rutiinista

Jokin pielessä?

4

509

    Vastaukset 4

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • Ei välttämättä mikään pielessä.

      C-kieli on käytännössä sitä assembleria mistä ohjelmallisesti tuotetaan optimaalinen tavukoodi prosessorin ajettavaksi ja prosessorivalmistajat optimoivat sitä kääntäjää. Käsin tavukoodin nysvääminen tuskin tuottaa nopeampaa tulosta.

      Käsin tavukoodin nysvääminen yleisesti ottaen ollut sellaista mitä kannattanut välttää viimeiseen asti ja ollut 20v sellainen tilanne, että kääntäjästä parempaa tulosta ei oikein saa missään.

      Itseasiassa 20v sitten oli sellainen kieli kuin Haskell kypsynyt jo niin hyväksi, että sillä pystyi ohjelmointikielen tasolla varmistamaan että ei ole sivuvaikutuksia koodissa joka sitten mahdollistanut optimointeja jotka ovat ihmiselle hyvin vaiketa saada virheettömästi tehtyä. Käytännössä tekeekin semmoista temppua että voi saada helposti tuotettua nopeampaa koodia mitä C:llä, kun jo C:llä sai parempaa koodia mitä käsin tavukoodia nysväämällä.

      • Kyllä kyllä, mutta tuo koodi on SUORA disassembly samasta C-rutiinista


      • tractor kirjoitti:

        Kyllä kyllä, mutta tuo koodi on SUORA disassembly samasta C-rutiinista

        "glibc strlen voitti tämän rutiinin, eli se oli ~ 3-4% nopeampi kuin tämä
        vaikka tämä koodi on melkein suora disassembly kyseisestä glibc rutiinista"

        Sanoit että melkein suora, eli ei identtinen.


    • Anonyymi

      Miten on koodisi alignment? Sillä on helposti 3-4 % merkitys, kun hyppyjä tehdään paljon.

      Mutta missä on repnz scasb, jolla strlen oli aikaisemmin toteutettu? Sitä tehokkaampaa koodia tuskin saa tehtyä luuppaamalla, vaikka hyödyntäisi 64-bittisiä rekistereitä yo. koodin tavoin.

    Ketjusta on poistettu 0 sääntöjenvastaista viestiä.

    Luetuimmat keskustelut

    1. Uskallanko laittaa sulle viestiä?

      Se viesti on tossa valmiina ja lähettämistä vaille valmis. Kun ei kauhee sti tunneta niin eipä sillä olisi niin väliä. S
      Ikävä
      61
      925
    2. Mikä tekee kaivatustasi

      Haluttavan?
      Ikävä
      34
      857
    3. Lehtikankaan oppilas kuolema

      Mistä lie tyttöparka löytyny, mikä ajaa tekemään itsemurhan tuon ikäsenä 😞
      Kajaani
      16
      826
    4. Onko nyt kaikki asiat käyty läpi?

      Mun mielestä on👍
      Ikävä
      105
      813
    5. Mies joka on oikeasti kiinnostunut

      Ja näkee sut pitkäaikaisena kumppanina, siirtää vaikka vuoria selvittääkseen asiat eikä ota pienintäkään riskiä menettää
      Ikävä
      125
      796
    6. Vieläkin saat

      Sydämen tykyttämään. Vaikka emme näe
      Ikävä
      38
      713
    7. 42
      589
    8. Rauha, sopiiko

      Ei häiritä enää toisiamme. Annetaan molemmille rauha unohtaa, pyydän tätä todella. Kiitos. Miehelle.
      Ikävä
      72
      586
    9. Ei siitä pääse yli, eikä ympäri!

      Pakko se on myöntää ja tunnustaa. Olisin halunnut p*nna sinua sydämeni kyllyydestä. Itseäni vanhemmalle naiselle
      Ikävä
      66
      581
    10. En tahallaan sua välttele...

      Olis niin kiva nähdä jossain muualla kuin kaupassa!
      Ikävä
      40
      557
    11. Kunnanhallitus

      Miten käy täällä vuosia tuomioita jakaneelle valittajalle, hovioikeus hylännyt kaikki syytteet.
      Puolanka
      29
      543
    12. Nyt kaatuu Kuisla

      Reima Kuisla hakee saneeraukseen – Joitakin velkoja on jo ulosotossa https://www.ilkkapohjalainen.fi/reima-kuisla-hakee
      Seinäjoki
      27
      503
    13. Miesten (epä)viehättävyydestä kysymys

      Mieltä askarruttava asia, liki dilemma. Palstallahan jotkut miesoletetut usein toteavat, että kaikki naiset tavoittelev
      Sinkut
      112
      468
    14. Tässä ovat Elämäni biisi vieraat lauantai 19.9. - Yksi vieras on kohuttu TTK-juontajaehdokas

      Elämäni biisi vieraslista on harvinaisen mielenkiintoinen lauantaina. Mukana myös kohuttu TTK-juontajaehdokas, josta ei
      Tv-sarjat
      2
      462
    15. Olit hyödytön.

      Mulle hyödytön..
      Ikävä
      88
      458
    16. Kumpi tästä nyt

      Teki niin vaikeaa?
      Ikävä
      60
      454
    17. Minkä kappaleen

      haluaisit soivan, kun astellaan alttarille?
      Ikävä
      37
      437
    18. Pystyisitkö liikkumaan

      Tai tapailemaan kaivattuasi julkisesti?
      Ikävä
      45
      436
    19. 39
      423
    20. Vieläkö tykkäät

      Minusta niin paljon että olisit valmis?
      Ikävä
      35
      407
    Aihe