Měření rychlosti jednotlivých instrukcí
Měření počtu tiků
Operace rdtsc
uloží do registru EDX:EAX interní čas procesoru, typicky počítadlo tiků. Lze použít k odhadu, jak dlouho která operace trvá -- problém s přerušením, významem tiků, vykonáváním operací mimo pořadí, atd.
unsigned long long measure_time() { _asm { rdtsc; push edx push eax; ... mereny kod ... ... idealne smycka ... rdtsc; sub eax, [esp]; sbb edx, [esp + 4]; add esp, 8; } }
Instrukce LEA
Výpočet adres se provádí během fáze dekódování instrukce. Jedná se tedy o nejrychlejší možný výpočet. Instrukce lea
umožnuje efektivně vypočítat adresu místa v paměti. Tuto instrukci je možné použít i pro rychlé násobení. Např. násobení devíti:
mov eax, a lea eax, [eax + 8 * eax]Operaci lea jde použít i ke sčítání ve tvaru A := B + C.
Úkoly
- Srovnejte rychlosti jednotlivých operací, soustřeďte se na operace ADD, MUL, SHL, LEA, PUSH, POP, MOV, atd.
- Srovnejte rychlosti násobení konstantou s použitím operace MUL, SHL (+ADD) a LEA.
- Napište funkci
int strtoint(char * str)
, která převede dekadický zápis čísla na jeho celočíselnou hodnotu. Tuto funkci optimalizujte na rychlost. Jednotlivé varianty programu si uschovávejte.