Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Clockticks (Assembly)

tgunner [17.06.2006 23:03:03]

#

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ä!

Metabolix [19.06.2006 13:28:56]

#

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.

tejeez [19.06.2006 14:10:31]

#

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.

tgunner [19.06.2006 15:20:16]

#

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.

pukki [27.06.2006 16:59:37]

#

http://www.geocities.com/izenkov/howto-rdtsc.htm

Olisko tuosta mitään apua?
Toimii tosin vasta Pentiumista ylöspäin.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta