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