Optimalizalas temahoz
Rancz Lajos
csigaelektro at freemail.hu
Fri Mar 25 08:58:31 CET 2005
Helló!
Na, asszem mégis írok még egy levelet threadhez ;-)
On Fri, 25 Mar 2005 07:45:53 +0100, Csobolyó János wrote:
> A C forditok marha jól optimalizalnak, ember asmben a közelükbe sem
> ér.
Ezt senki sem mondta! A vitának az volt a lényege, hogy a fordító az esetek _többségében_ kielégítő kódot generál, amivel semmit nem kell csinálni, mert ár/teljesítmény arányban megfelelő. Legutóbbi projektem C forrása kb. 17 000 sor, a gépikód kb. 3200 sor. C-ben van az fájlrendszer, egy általános menürendszer, egy általános adatbeviteli form kezelő rendszer, a többnyelvűség kezelése, a szoftveres pipe és stack kezelés. Gépi kódban a kijelző és egy-két hardver periféria buzerálása, ami kb. 2 kilobájt. Az egész lefordított project nagyjából 42 kb, tehát a Cben írott rész nagyjából 40 kb, ebből az adódik, hogy átlagosan 40 * 1024/17 000 = 2.4 bájt/sor, ami azért nem olyan rossz. A használt proci egy 8051 klón volt (AT89C51CC03), nem állt rendelkezésre semmilyen emulátor, csak egy soros letöltő + FLIP. Nem mondom, hogy nem lehetett volna megírni asm-ben és valószínű rövidebb is lenne a fordított kód, max kb. a fele. De! A procinak mindegy, hogy 42 kb vagy 64 kilobájt kód van a flashben, nem kapom meg olcsóbban. Kisebb proci nem jöhet számításba mert a hardveres lehetőségek kopp ki vannak használva. Tehát, lehet, hogy fele akkorára meg tudom írni ASMben, de hogy dupla annyi idő alatt az biztos, és nem lett volna semmi értelme.
> Igaz vannak a forditoban hibak, nem minden procira vannak jol
> megcsinalva, egyket dolgot nem vesznek eszre vagy felre ertelmeznek
> amit az ELMELETI jo C fordito siman jol csinalna.
Nincs elméleti C fordító. Egy C fordító a mechanikus vacakolásokon (kösz VF :-) túl nem sok mindent tud kezdeni. De azért az nem olyan kevés, ha jobban belegondolunk! Ilyen értelemben mechnikus vacakolás a végeselem számítás és a sakk is. Ez a típusú mechanikus gondolkodás az, ami az ember agyának a legkevésbé megy. A sebesség döntő többségét nem a gépikódban szénne optimalizálás jelenti (ugye az max n-szeres gyorsítás), hanem a jó algoritmus adja. Egy DSP-s projectemben úgy tudtam kb. 2szeres sebességnövekedést elérni (a kb. 10 soros ciklusmag 24 milliószor fut le másodpercenként), hogy megnyúltam a matematikai alapokat és az eredeti szűrőarchitektúrával ekvivalens, de gyorsabb rendszert csináltam. Nyilván mindkét esetben totál le volt minimalizálva gépikód szinten a számítás (mindkét esetben kb. 3-4 nap volt a 10 sor megírása :-), de a sebesség a matematikán múlt. (De nyilván szükség volt a gépikód optimalizálására!!!!)
Szóval így utolsó szóként annyiban összegezném a mondandómat (és ennél semelyik levelemben nem írtam többet), hogy a C fordító általában _rosszabb_ kódot generál a teljesen optimálisnál, de szintén általában ez teljesen megfelel, és nincs szükség a teljes optimalitás elérésére.
Üdv,
Lajos
More information about the Elektro
mailing list