C vagy Pascal nyelven gyorsabbak a tömbműveletek, tömbelemekhez való hozzáférés sebessége?
Statikus megvalósításra gondoltam, mert dinamikus tömb esetén jóval lassabb Pascal-ban a hozzáférés.
Bár a C - tudomásom szerint - minden tömböt dinamikusan kezel elvileg.
#1: Dehogy kellene.
Azt leszámítva, hogy divat lett szidni, semmivel nem rosszabb, mint az agyonhype-olt nyelvek.
Egyébként pedig nem igazán a nyelvtől, hanem implementációtól, a konkrét fordítótól, és a fordítási beállításoktól függ, hogy melyikben mi mennyire gyors. De hacsak nem valami übernagy adathalmazt kell kezelned, vagy ha nem kell brutális mennyiségű műveletet elvégezned, akkor igazából jelentéktelenek a különbségek.
Mennyire optimalizálja ki a kódot, igen, engem is ez foglalkoztat, tehát hogy ha rengeteg elemen kell műveleteket végezni akkor jelentős eltérés lehet -e.
Gyakran írják a C bináris kódról, hogy "majdnem olyan gyorsak mintha assembler-ben írták volna".
Nem statikus, vagy dinamikius tömbre fgondoltam, hanem a tömbelemek elérésére. Ha az pointeres, akkor a C-vel egyenértékű, sebesség szempontjából.
A C valóban majdnem olyan gyors mintha assemblyben írták volna, már csak azért is, mert a C kimenete nem más mint assembly.
Ahogy a 4. válaszoló is írja, a sebesség a fordítótól függ elsősorban, nem a nyelvtől.
A borland pascal (delphi 5+) fordítói 100 % assemblyben lettek lefejlesztve, a fejlesztők nagyon tudták, hogy mit csinálnak, így a generált kód is általában elég gyors lett. A dos meg eleve úgy volt shit ahogy volt.
A C fordítók esetében is az volt a jellemző, hogy írtak egy transpilert, ami a c forrásból asm outputot generált, amit aztán valamilyen jobb féle assemblerrel fordítottak binárisra. Lehetőleg olyan assemblerrel, amely még optimalizálni is jól tudott.
Ma már az előfeldolgozó, az optimizer és a fordító általában együtt van.
A standard c és a pascal forrásból fordított bináris között a c javára talán ha 5 % előny van maximum, már ha egyáltalán van, adott esetben, kellően hosszú, összetett kód esetén.
"A C valóban majdnem olyan gyors mintha assemblyben írták volna, már csak azért is, mert a C kimenete nem más mint assembly."
Teljesen jogos, de azért hozzátenném, hogy ugyanazt a műveletsort le lehet fordítani pl. 5 és 35 assembly utasítássá is, akár nagyságrendi órajelciklus igény különbséggel. Láttam már olyan fordító összehasonlító tesztet, ahol hasonló különbségek voltak az asm kimenetben, ugyanabból a C kódból kiindulva.
Amúgy a Pascal fordítók régen is elég tömör, gyors kóddá fordítottak. (Nem tudom, azóta változott-e, de nem hiszem.) Ilyen szempontból komoly versenytársa volt a C-nek, és még kicsit a szintaktikája is átláthatóbb volt. Talán marketing oka lehetett, hogy az Object Pascalnak a rengeteg lib-bel együtt sem sikerült annyira elterjednie, mint a C/C++-nak.
"Teljesen jogos, de azért hozzátenném, hogy ugyanazt a műveletsort le lehet fordítani pl. 5 és 35 assembly utasítássá is, akár nagyságrendi órajelciklus igény különbséggel."
Igen, ez így van.
Itt kap szerepet a tárgyi tudás, a tapasztalat, az affinitás, a kisérletező kedv, na meg persze a ráfordított idő. Ettől lesz egyik compiler jobb, rugalmasabb, értékesebb a másiknál.
És hát, igen, silány kódot lehet fejleszteni assemblyben is.
Sajnos az Object Pascal háttérbe szorulása leginkább arra vezethető vissza, hogy akivel a Microsoft összerugja a port, attól a piac igyekszik mihamarabb eltávolodni. Így történt ez az amúgy remek Gravis kártyák gyártójával és ennek okán zuhant meg a Borland is. Bár tény, a Borland bukásába a saját töketlenkedése is vastagon belejátszott (hülye névváltoztatás, termékvonal kisiklatása, kylix, turbo delphi, BSA tagság, stb).
Na meg, a C/C++ fordítók területén volt verseny, Object Pascal vonalon meg gyakorlatilag monopolhelyzetben volt a Borland, holott, nagyon jót tett volna nekik legalább egy darab konkurrens.
Igen, köszönöm, én is erre tippeltem, hogy piaci okai lehettek. A lényeg, hogy nem igazán technikai okai voltak.
A főkérdésre: A tömbműveleteket a procik utasításkészlete is támogatja, már régóta létezik indexelt címzési mód, hardveres címszámítással, úgyhogy ha megfelelő asm kódra fordítódik első körben, akkor nem szabadna nagy különbségnek lennie. Általánosságban egy a[cím] tömbelem elérése: a + (cím * elemméret).
"Free Pascal treats pointers much the same way as C does. This means that a pointer to some type can be treated as being an array of this type."
"Free Pascal supports pointer arithmetic as C does."
** "a[cím] tömbelem elérése: a + (cím * elemméret)"
Bocs, inkább index, mint cím:
a[index] --> a + (index * elemméret)
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!