Odpovìï : Re: Sou?et v C - neni pro PICjiny kompilator?
Jakub Slajs
xslajsj
Středa Březen 17 14:31:20 CET 2004
> To neni tak uplne pravda. Vlastne to neni vubec pravda. Jednak neni
> zadny principialni duvod, proc by melo C generovat rychlejsi kod nez
> ostatni prekladace, naopak "diky" jeho omezene a nejasne syntaxi je
> nekdy problem rozpoznat jak to vlastne programator minil a prislusne
> to optimalizovat.
Neberte to prosim jako flame ale nemate pravdu.
Nechapu co chcete rici omezenou syntaxi ale sila jazyka C je mimo jine
i v tom ze Vam umozni napsat takove "parasarny" ktere Vam rada jinych
jazyku proste nepovoli ;-)
Kolik jinych jazyku Vam napriklad umozni "napovedet" kompilatoru aby
dal nekterou promenou do registru a ne na zasobnik. Kde jinde muzete
delat takove psi kusy s pointerovou aritmetikou. Proste spoustu
optimalizaci si muzete delat rucne a nespolehat se jen na kompilator.
> Ale hlavne rychlost pri programovani v ASM je dana tim, ze clovek voli
> jiz samotny algoritmus (napriklad prohledavani pole) uz primo
> optimalizovany pro ASM, coz zatim ani nejlepsi prekladace vyssich
> jazyku nedokazou.
Volba algoritmu je vzdy dulezita a to bez ohledu na to jestli pisu
v ASM nebo C. Viz napr. ono prohledavani pole (prvni vyskyt daneho
prvku). Vetsina lidi to napise nasledovne (nebo podobne, dulezity je
algoritmus nikoli jazyk!):
int i = 0;
while (i<pole.length) {
if (pole[i] == hledany_prvek) break;
i++;
}
if (i == pole.length) => prvek nenalezen
else => i - pozice prvku
Problem je v tom ze v tele cyklu while se provadeji dva testy
kontroluje se rozsah pole (i<pole.length) a soucasne rovnost prvku.
Lepe to lze napsat tak, ze pouzijeme pole o jeden prvek delsi
a hledany prvek umistime na konec. Pak nemusime kontrolovat rozsah
indexovani protoze prvek vzdy najdeme a tim se cyklus ukonci.
while (pole[i] != hledany_prvek) i++;
Pote pouze zkontrolujeme jestli jsme nasli prave ten posledni
prvek protoze pak jsme vlastne nenasli nic ;-)
I kdyz ten prvni priklad napisete superoptimalne v asm a druhy
prelozite napr. v C tak ten druhy bude vzdy rychlejsi (za
predpokladu ze to pole nebude mit extreme malo prvku) ;-))
S pozdravem,
Jakub Slajs
Další informace o konferenci Hw-list