18
Optimalizáljunk C/C++ Optimalizáljunk C/C++ kódokat! kódokat! Illés Márton, BalaBit Illés Márton, BalaBit

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

Embed Size (px)

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

Page 1: Hogyan optimalizáljunk C/C++ kódokat!

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

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

Page 2: Hogyan optimalizáljunk C/C++ kódokat!

O(1)

Page 3: Hogyan optimalizáljunk C/C++ kódokat!

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

Page 4: Hogyan optimalizáljunk C/C++ kódokat!

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!

Page 5: Hogyan optimalizáljunk C/C++ kódokat!

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?

Page 6: Hogyan optimalizáljunk C/C++ kódokat!

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

Page 7: Hogyan optimalizáljunk C/C++ kódokat!

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

Page 8: Hogyan optimalizáljunk C/C++ kódokat!

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!

Page 9: Hogyan optimalizáljunk C/C++ kódokat!

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

Page 10: Hogyan optimalizáljunk C/C++ kódokat!

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?

Page 11: Hogyan optimalizáljunk C/C++ kódokat!

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?

Page 12: Hogyan optimalizáljunk C/C++ kódokat!

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

Page 13: Hogyan optimalizáljunk C/C++ kódokat!

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

Page 14: Hogyan optimalizáljunk C/C++ kódokat!

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

Page 15: Hogyan optimalizáljunk C/C++ kódokat!

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

Page 16: Hogyan optimalizáljunk C/C++ kódokat!

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

Page 17: Hogyan optimalizáljunk C/C++ kódokat!

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! :)

Page 18: Hogyan optimalizáljunk C/C++ kódokat!

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

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

[email protected]://marci.blogs.balabit.com/