Értelmes elgondolás egy programot úgy felépíteni, hogy a számítás igényes részeket kiszervezem unmanaged C++ project-be és dll-eken keresztül használom őket C# alól?
"Ha igen, akkor valószínűleg vagy a programod rossz, vagy egyszerűen nem lehet tovább optimalizálni."
Persze, vagy csak a garbage collector meg a tömbök objektumként kezelése lehúzza a teljesítményt. Minden egyes tömbelem elérése C#-ban boundary checket okoz, megérheti a C++-ban megvalósítás.
"Minden egyes tömbelem elérése C#-ban boundary checket okoz, megérheti a C++-ban megvalósítás."
hűűűha!
De szerintem nem érted, hogy mit magyaráztam.
A boundary check nem változtatja az algoritmus komplexitását.
Itt pedig ami fontos, az az algoritmus komplexitása.
Az ilyen jellegű optimalizálásra, mint a boundary check megszüntetése, akkor van szükség, amikor sok számítógépen kell futtatni a programot, vagy pedig egy gyenge számítógépen kell mindenképp jó teljesítményt elérni. Az előbbi jellemzően szerverek, video renderelés, osztott rendszerek esetén jelentkezik, az utóbbi meg játékok, grafikai alkalmazások, stb. esetén. Ha van egy programod, aminél nem kulcselem a realtime interakció, és nem futtatod folyamatosan, hanem csak alkalmanként, akkor az ég egy adta világon semmi jelentősége nincs annak, hogy mennyire optimális futásidő szempontjából az adott nyelv.
pl. sok tudományos számításhoz is Python nyelvet használnak, pedig az vagy 100-szor lassabb, mint a C++. Így a program lehet, hogy 3 nap helyett 7 nap alatt fut le. De, ha a programot megírni 100 nap helyett csak 90 nap volt, akkor máris nagyon-nagyon megérte a Python-t használni, hiszen az eredményt ígyis, úgyis hamarabb kapod meg. A különbség pedig általában nem 100 nap vs. 90 nap, hanem inkább 100 nap vs 60 nap
"Itt pedig ami fontos, az az algoritmus komplexitása."
Sajnálom, de a gyakorlatban számít a lineáris gyorsítás, ha egy-egy műveletet megspórolsz a tömb eleminek elérésénél (ami nagyságrendileg legalább milliószor megtörténik). Ez nem arról szól, hogy mennyi idő alatt írod meg a programot, hanem ugyanannál az algoritmusnál a kényelmi funkciók hatással vannak a teljesítményre.
""Itt pedig ami fontos, az az algoritmus komplexitása."
Sajnálom, de a gyakorlatban számít a lineáris gyorsítás, ha egy-egy műveletet megspórolsz a tömb eleminek elérésénél (ami nagyságrendileg legalább milliószor megtörténik). Ez nem arról szól, hogy mennyi idő alatt írod meg a programot, hanem ugyanannál az algoritmusnál a kényelmi funkciók hatással vannak a teljesítményre."
hmm. És ennek én hol írtam az ellenkezőjét? Én pontosan ugyanezt írtam, és gondolom. Csakhogy, ez nem érv arra, hogy a futásidőre optimalizálj. Miért is lenne? Az, hogy vannak olyan nyelvek, amelyekkel a futásidőre lehet optimalizálni, nem implikálja azt, hogy ez az egyetlen lehetséges megközelítés. Mint ahogy írtam, van amikor ez fontos, van amikor meg más. Ha csak egy eredményre van szükséged, akkor nem az számít, hogy a nyelv milyen fontos, hanem az, hogy a szoftver elkészítése, és futtatása együttesen mennyi időt tesz ki. Sőt, képzeld gazdasági indokok is léteznek, meg kódfenntarthatóság.
Igen, ha mindenképpen futásidőre kell optimalizálnod, akkor inkább C++-t válassz, mint C#-ot. Ez evidens. Ugyanakkor az is evidens, hogy ezzel önmagában semmit nem érsz el, mert nem ettől fog optimális lenne a programod. Ha írsz lineáris helyett egy exponenciális algoritmust, akkor nem sokra mész azzal, hogy C++-t választottál C# helyett. Ezért írtam azt, hogy az algoritmus többet számít, mint a nyelv.
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!