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.