Nyt kun olen alkanut harrastelemaan vähän enemmän Assembleriä, olen innostunut kamalasti optimoimaan koodiani nopeammaksi ja nopeammaksi.
Ja eräänä päivänä kun luin Assembler-opasta, kohtasin asian nimeltä "clockticks", Googlettelin vähän aikaa kunnes tajusin että se on sitä prosessoriaikaa. Oppaassa oli myös pieni taulukko eri komentojen käyttämille clocktickeille, mutta nyt haluaisin tietää että miten voin mitata clocktickit omasta ohjelmastani?
Google antoi vain C/C++ aiheisia keinoja, mutta nyt on kyse Assembleristä!
Assembly on se kieli ja kellojakso taitaisi olla tuolle oikea suomennos. Termit kohdalleen ensin.
Tarvinnet jonkin tavan ottaa aikaa. Ei kai siinä sen jälkeen muuta kuin että vertaat riittävän suuria määriä ja katsot, kauanko niillä kestää. Vastaus on joka tapauksessa kokonaisluku, joten oikeaan vastaukseen varmaankin pääsee jo heti, kunhan määrät ovat sellaisia, että ajanotto onnistuu. Lähtökohtana voi käyttää muutamaa perusoperaatiota, jotka varmasti vievät vain yhden kellojakson. Normaalisti vaikkapa näin:
mov ecx, sopiva_iso_luku ; montako kierrosta lasketaan call kello_on_nyt ; ajanottofunktio palauttakoon nyt oletettavasti ajan jossakin muodossa eax-rekisterissä push eax alku: operaatio ; Mitä ikinä lasketkin... dec ecx jnz alku call kello_on_nyt pop ebx sub ebx, eax ; tähän voisi vielä lisätä sen, että vähennetään silmukan kesto ilman mitään operaatiota, niin laskelmat helpottuvat.
Luulenpa, että noi tarkat kellojaksojen määrät riippuu ihan prosessoreista ja varmaan vaikka mistä muustakin. Ehkä on parempi laskea vain sekunteja eikä mitään kellojaksoja? :P
Metabolix kirjoitti:
Lähtökohtana voi käyttää muutamaa perusoperaatiota, jotka varmasti vievät vain yhden kellojakson.
hmm, onkohan x86:ssa mitään mikä vie vain yhden? no joo. varmaan seki riippuu prosessorista.
Pah, assembleriksi olen aina kutsunut assemblyä vaikka tiedän hyvin että assemblereitä ovat esimerkiksi nasm ja tasm.
Mutta kiitos kuitenkin :)
Ja tejeezille:
Kyllä 486 mallilla on esimerkiksi ADD tai POP jotka vievät vain yhden. Ja kaikki operaattorit taitavat viedä vain yhden kanssa.
http://www.geocities.com/izenkov/howto-rdtsc.htm
Olisko tuosta mitään apua?
Toimii tosin vasta Pentiumista ylöspäin.
Aihe on jo aika vanha, joten et voi enää vastata siihen.