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. Puukotus Kajaanissa

      Kuka puukotti ja ketä? https://yle.fi/a/74-20247765 Vähemmän yllättäen päihteet mainittu
      Kajaani
      50
      1178
    2. Taas henkirikos

      Kuka lienee nyt asialla.
      Ilomantsi
      16
      815
    3. 68
      732
    4. Mitä söpö

      Mies mietit?
      Ikävä
      63
      725
    5. Miten uskallan sua nähdä

      Kun vaikutat suuttuneelta :(
      Ikävä
      47
      694
    6. Nainen, tässä olen kahden vaiheilla

      Toinen pitäisi valita ja kummassakin on hyvät ja huonot puolensa. Toinen olisi sellainen pysyvä mutta työläs. Toinen taa
      Ikävä
      69
      688
    7. Hyvä on sitten, jos et sitä s*ksiä halua kanssani.

      Rakastetaan vaan toisiamme, voin käydä muualla tyydyttämässä fyysisenpuolen tarpeet. Puhumalla tämäkin olisi selvinnyt.
      Ikävä
      131
      615
    8. Suloinen ja herkkä

      Toiset huomioiva, räväkkä, yllättävä. Ei sellaisesta voi olla pitämättä.
      Rakkaus ja rakastaminen
      31
      585
    9. Humalassa autolla ajo.

      Tuhti humala hyydytti kuljettajan Suomussalmella -sammui rattiin ,uutisoi Ylä-Kainuu.
      Suomussalmi
      9
      540
    10. Minä muistan

      Minä muistan sinut nauravana. Sellaisena, joka sai tavallisenkin hetken tuntumaan vähän kevyemmältä, kuin huoneeseen ol
      Ikävä
      45
      508
    11. Tiesitkö? Jorma Uotisen EX-rakas on Helena Lindgren - Nämä ovat välit nyt: "Me ollaan..."

      Jorma Uotinen ja Helena Lindgren olivat avoliitossa v. 1982-1999. Pariskunta oli aikansa näyttävä julkkispari, missä i
      Kotimaiset julkkisjuorut
      8
      500
    12. Hurja pako Kuhmossa

      19 vuotias kaahasi humalassa jalkakäytävälle tänään. Kuka mitä häh.
      Kuhmo
      4
      472
    13. Jäljitelmä Birginit

      Ei jumaleisson, Jeffin vaimo kertoo et nää Hermesit olikin jäljitelmiä ja timangit labrarääsää. Anna mun kaikki kestää �
      Kotimaiset julkkisjuorut
      104
      469
    14. Hyvää yötä hurmuri

      Iltaa haaveeni! Kauniita unia😘 Jospa me vielä nähtäis ja juteltais, suukoteltais ja halittais, siliteltäis ja hyväiltä
      Ikävä
      24
      463
    15. Pitäisikö seksille asettaa huvivero?

      (ja jos hankkisi todistuksen sen harrastamisesta velvollisuudesta tai lisääntymistarkoituksessa, saisi siitä vapautuksen
      Sinkut
      113
      434
    16. Olet pelottava ilme vakavana

      Sitä alkaa ajatella äkkiä kaikenlaista. Synkkiäkin juttuja. Kai tässä oma mielikuvitus kun laukkaa. 🤔😳
      Ikävä
      26
      427
    17. Mä voisin rakastua noihin tähti silmiin

      Katseesi on niin lumoava nainen💚.
      Ikävä
      16
      421
    18. Kaduttaako kun jätit vastaamatta

      Vai oliko tarkoitus satuttaa?
      Ikävä
      34
      404
    19. Taidat olla

      Luovuttanut jo minun suhteeni osalta?
      Ikävä
      33
      401
    20. Jos tullaan toisiamme vastaan, niin

      pitäiskö pysähtyä ja onnitella?
      Ikävä
      35
      399
    Aihe