A zase ty BogoMips :-)
Jaroslav Gratz
xgratz01 na stud.fee.vutbr.cz
Středa Červenec 12 21:39:50 CEST 2000
On Wed, 12 Jul 2000, Michal Krause wrote:
> Udelejte si programek, kde bude jenom neco jako
>
> for (i = 0; i < 100000000; i++);
>
> a zkompilujte ho bez optimalizace a s -O3. Ve druhem pripade bude zhruba
> dvakrat rychlejsi a i vyegenerovany assembler je jiny.
Když jsme u těch optimalizací tak tohle se dá napsat
xor eax,eax
cyklus: inc eax
cmp eax,100000000
jl cyklus
> Mimochodem, prave me napadlo, ze tenhle priklad by sel optimalizovat na
>
> i = 100000000;
>
> coz je asi jedna instrukce :)
A tohle:
xor eax,eax
cyklus: inc eax
cmp eax,100000000-1
jne cyklus
Což je stále stejné. Mimochodem na Pentiu trvá provedení takového kódu
200000001 taktů (cmp a jnz se spárují a provedou v jednom taktu).
Tak a teď jsem se díval jak to přeložilo gcc -O3 a je to
mov eax,100000000-1
cyklus: dec eax
jns cyklus
Z čehož jasně vyplývá, že bych to měl s assemblerem zabalit :-) Smyčka
trvá sice stejnou dobu (dec a jns Pentium nespáruje), ale je to o bajt
kratší...
Ale musím to gcc nějak trumfnout
xor eax,eax
cyklus: inc eax
inc eax
inc eax
inc eax
inc eax
cmp eax,100000000
jl cyklus
A to je 120000001 taktů, takže skoro 2x rychlejší :-)
Píšu si trestné body za OT, to já jen že se někdo ptal jak se dá
optimalizovat jednoduchá smyčka.
P.S.
Nespuštějte ten kód v USA, tam už na to mají patent a je to ilegální...
Jaroslav Gratz
Další informace o konferenci Linux