Hogyan optimalizáljunk C/C++ kódokat!

Preview:

DESCRIPTION

Az idő pénz, vagyis a sebesség érték. A gyorsabb szoftver tehát értékesebb, és ami értékesebb azt drágábban lehet eladni.

Citation preview

Optimalizáljunk C/C++ Optimalizáljunk C/C++ kódokat!kódokat!

Illés Márton, BalaBitIllés Márton, BalaBit

O(1)

Miről lesz szó?Miről lesz szó?

• Optimalizálásról általábanOptimalizálásról általában

• Hasznos segédeszközökHasznos segédeszközök

• Teljesítmény tesztelésTeljesítmény tesztelés

• Gyakorlati példákGyakorlati példák

• syslog-ng tapasztalatoksyslog-ng tapasztalatok

Optimalizáció 1x1Optimalizáció 1x1• Optimalizálási célok:Optimalizálási célok:

• CPU használatCPU használat

• Memória használatMemória használat

• Disk használatDisk használat

• ““sebesség” - futási idősebesség” - futási idő

• SkálázódásSkálázódás

• Energia hatékonyságEnergia hatékonyság

• Költségek!Költségek!

MódszerekMódszerek

• Adatszerkezetek és algoritmusok kiválasztásaAdatszerkezetek és algoritmusok kiválasztása

• Cél az O(1) :)Cél az O(1) :)

• Komplex rendszerek esetén különösen fontos a Komplex rendszerek esetén különösen fontos a megfelelő architektúra kiválasztásamegfelelő architektúra kiválasztása

• Optimalizáció vs. Hordozhatóság vs. OlvashatóságOptimalizáció vs. Hordozhatóság vs. Olvashatóság

• Mikro-optimalizálások sokat tudnak számítaniMikro-optimalizálások sokat tudnak számítani

• Tudomány vagy művészet?Tudomány vagy művészet?

Slow- és fast-pathSlow- és fast-path

• Nem kell mindig mindent optimalizálniNem kell mindig mindent optimalizálni

• Átlagos és maximális eset nem mindig esik Átlagos és maximális eset nem mindig esik egybe!egybe!

• Érdemes lehet a kivételeket külön, slow-path-Érdemes lehet a kivételeket külön, slow-path-on kezelni!on kezelni!

• Egy gyors fast-path és egy elég jó slow-path Egy gyors fast-path és egy elég jó slow-path lehet optimális megoldáslehet optimális megoldás

Pár szó a hardverrőlPár szó a hardverről

CPU feldolgozási sebesség jelentősen növekedettCPU feldolgozási sebesség jelentősen növekedett

Memória méret, használható address space is megnőttMemória méret, használható address space is megnőtt

Jellemzően több processzoros, több magos rendszerekJellemzően több processzoros, több magos rendszerek

Processzor jóval gyorsabb, mint a memória, disk elérésProcesszor jóval gyorsabb, mint a memória, disk elérés

Virtualizált, cloud megoldásoknál nem a “miénk” a teljes gépVirtualizált, cloud megoldásoknál nem a “miénk” a teljes gép

Beágyazott és mobil eszközök továbbra is különlegesekBeágyazott és mobil eszközök továbbra is különlegesek

Teljesítmény tesztelésTeljesítmény tesztelés• StressztesztStresszteszt

• Hogyan viselkedik a rendszer nagy terhelés esetén?Hogyan viselkedik a rendszer nagy terhelés esetén?

• Teljesítmény mérés - eredményekTeljesítmény mérés - eredmények

• Mérőszámok meghatározásaMérőszámok meghatározása

• Különböző bemeneti minták és beállítások teszteléseKülönböző bemeneti minták és beállítások tesztelése

• Micro-benchmarkMicro-benchmark

• A program egy-egy kritikus részének folyamatos A program egy-egy kritikus részének folyamatos tesztelésetesztelése

• Regresziók felderítésére nagyon hasznos!Regresziók felderítésére nagyon hasznos!

EszközökEszközök

• Találgatás helyett érdemes mérni!Találgatás helyett érdemes mérni!

• Legjobb barátunk a profiler!Legjobb barátunk a profiler!

• Rendszer-szintű mérőszámok is sokat segíthetnekRendszer-szintű mérőszámok is sokat segíthetnek

• Pár hasznos segédprogramPár hasznos segédprogram

• Oprofile, perf, valgrind, pahole, gprof/gcov, timeOprofile, perf, valgrind, pahole, gprof/gcov, time

Optimalizáljunk!Optimalizáljunk!• Feladat:Feladat:

– Szöveges fájl felolvasásaSzöveges fájl felolvasása

– Soronként szöveg tokenizálása és tokenek Soronként szöveg tokenizálása és tokenek számlálása, beépített naplózássalszámlálása, beépített naplózással

• Cél:Cél:

– Lehető legyorsabb futásLehető legyorsabb futás

• Nincs többszálúsítás!Nincs többszálúsítás!

• Mit tegyünk?Mit tegyünk?

Memória használatMemória használat

• Van, hogy a programunk túl sok memóriát Van, hogy a programunk túl sok memóriát eszik...eszik...

• Valami sokat foglal?Valami sokat foglal?

• Valamilyen objektumból túl sok van?Valamilyen objektumból túl sok van?

• Valamit elfelejtünk felszabadítani?Valamit elfelejtünk felszabadítani?

• Hogyan fogjunk neki?Hogyan fogjunk neki?

syslog-ng queue-ksyslog-ng queue-k

• Cél: szálak között üzenetek átadása, sorrend Cél: szálak között üzenetek átadása, sorrend helyesen, nagy mennyiségbenhelyesen, nagy mennyiségben

• Triviális megoldás:Triviális megoldás:

– Queue használata lockolássalQueue használata lockolással

• Probléma:Probléma:

– Nagy lock overheadNagy lock overhead

– Sok várakozás üres, vagy teli queue eseténSok várakozás üres, vagy teli queue esetén

syslog-ng queue-ksyslog-ng queue-k

• Több queue használata, batch szerűenTöbb queue használata, batch szerűen

• Lock nélküli fast-path és lock-olt slow-pathLock nélküli fast-path és lock-olt slow-path

Producer queue Consumer queue

Wait queueLock Lock

syslog-ng patterndbsyslog-ng patterndb

• Cél:Cél:

– Bejövő különböző szöveges üzenetek real-Bejövő különböző szöveges üzenetek real-time feldolgozása, klasszifikációjatime feldolgozása, klasszifikációja

Legelterjedtebb megoldás a regexp-ek Legelterjedtebb megoldás a regexp-ek használata.használata.

– Sok minta esetén lassú és nehezen Sok minta esetén lassú és nehezen karbantarthatókarbantartható

Accepted publickey for marci from 127.0.0.1 port 37126 ssh2

syslog-ng patterndbsyslog-ng patterndb

• Célok:Célok:

– Mintaillesztés ne függjön nagyban a Mintaillesztés ne függjön nagyban a minták számátólminták számától

– Egyszerű minta szintakszisEgyszerű minta szintakszis

• Megoldás:Megoldás:

– Kereső fa építése a minták alapjánKereső fa építése a minták alapján

– Változó részekhez “parserek” használataVáltozó részekhez “parserek” használataAccepted publickey for @STRING:username@ from @IPv4:source@ port @NUMBER:port@ ssh2

syslog-ng patterndbsyslog-ng patterndb

• Radix fa “literal” és “parser” elemekkelRadix fa “literal” és “parser” elemekkel

• Közel független a minták számátólKözel független a minták számától

Accepted publickey for

STRING: username

from

port

IPv4: source

KonkluzióKonkluzió

• Segédeszközök használata sokat könnyíthetSegédeszközök használata sokat könnyíthet

• Folyamatos ellenőrzés, regressziók felderítéseFolyamatos ellenőrzés, regressziók felderítése

• Nem érdemes mindent sebességre Nem érdemes mindent sebességre optimalizálnioptimalizálni

• Folyamatos tanulás, tervezés fontosságaFolyamatos tanulás, tervezés fontossága

• Környezet sajátosságaira érdemes figyelniKörnyezet sajátosságaira érdemes figyelni

• Használjuk az eszünket! :)Használjuk az eszünket! :)

Kérdések?Kérdések?

Köszönöm a figyelmet!Illés Márton

illes.marton@balabit.huhttp://marci.blogs.balabit.com/

Recommended