Optimalizáljunk C/C++      kódokat!     Illés Márton, BalaBit
O(1)
Miről lesz szó?•    Optimalizálásról általában•    Hasznos segédeszközök•    Teljesítmény tesztelés•    Gyakorlati példák•...
Optimalizáció 1x1•   Optimalizálási célok:    •   CPU használat    •   Memória használat    •   Disk használat    •   “seb...
Módszerek•   Adatszerkezetek és algoritmusok kiválasztása    •   Cél az O(1) :)•   Komplex rendszerek esetén különösen fon...
Slow- és fast-path•    Nem kell mindig mindent optimalizálni•    Átlagos és maximális eset nem mindig esik    egybe!•    É...
Pár szó a hardverről   CPU feldolgozási sebesség jelentősen növekedett   Memória méret, használható address space is meg...
Teljesítmény tesztelés•   Stresszteszt    •   Hogyan viselkedik a rendszer nagy terhelés esetén?•   Teljesítmény mérés - e...
Eszközök•   Találgatás helyett érdemes mérni!•   Legjobb barátunk a profiler!•   Rendszer-szintű mérőszámok is sokat segít...
Optimalizáljunk!•   Feladat:      – Szöveges fájl felolvasása      – Soronként szöveg tokenizálása és tokenek        száml...
Memória használat•    Van, hogy a programunk túl sok memóriát    eszik...•    Valami sokat foglal?•    Valamilyen objektum...
syslog-ng queue-k•   Cél: szálak között üzenetek átadása, sorrend    helyesen, nagy mennyiségben•   Triviális megoldás:   ...
syslog-ng queue-k•    Több queue használata, batch szerűen•    Lock nélküli fast-path és lock-olt slow-path        Produce...
syslog-ng patterndb  •      Cél:        – Bejövő különböző szöveges üzenetek real-          time feldolgozása, klasszifiká...
syslog-ng patterndb•    Célok:      – Mintaillesztés ne függjön nagyban a        minták számától      – Egyszerű minta szi...
syslog-ng patterndb•    Radix fa “literal” és “parser” elemekkel•    Közel független a minták számától            Accepted...
Konkluzió•    Segédeszközök használata sokat könnyíthet•    Folyamatos ellenőrzés, regressziók felderítése•    Nem érdemes...
Kérdések?          Köszönöm a figyelmet!                Illés Márton         illes.marton@balabit.hu     http://marci.blog...
Upcoming SlideShare
Loading in …5
×

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

1,138 views

Published on

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.

  • Be the first to comment

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

  1. 1. Optimalizáljunk C/C++ kódokat! Illés Márton, BalaBit
  2. 2. O(1)
  3. 3. Miről lesz szó?• Optimalizálásról általában• Hasznos segédeszközök• Teljesítmény tesztelés• Gyakorlati példák• syslog-ng tapasztalatok
  4. 4. Optimalizáció 1x1• Optimalizálási célok: • CPU használat • Memória használat • Disk használat • “sebesség” - futási idő • Skálázódás • Energia hatékonyság• Költségek!
  5. 5. Módszerek• Adatszerkezetek és algoritmusok kiválasztása • Cél az O(1) :)• Komplex rendszerek esetén különösen fontos a megfelelő architektúra kiválasztása• Optimalizáció vs. Hordozhatóság vs. Olvashatóság• Mikro-optimalizálások sokat tudnak számítani• Tudomány vagy művészet?
  6. 6. Slow- és fast-path• Nem kell mindig mindent optimalizálni• Átlagos és maximális eset nem mindig esik egybe!• Érdemes lehet a kivételeket külön, slow-path- on kezelni!• Egy gyors fast-path és egy elég jó slow-path lehet optimális megoldás
  7. 7. Pár szó a hardverről CPU feldolgozási sebesség jelentősen növekedett Memória méret, használható address space is megnőtt Jellemzően több processzoros, több magos rendszerek Processzor jóval gyorsabb, mint a memória, disk elérés Virtualizá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önlegesek
  8. 8. Teljesítmény tesztelés• Stresszteszt • Hogyan viselkedik a rendszer nagy terhelés esetén?• Teljesítmény mérés - eredmények • Mérőszámok meghatározása • Különböző bemeneti minták és beállítások tesztelése• Micro-benchmark • A program egy-egy kritikus részének folyamatos tesztelése • Regresziók felderítésére nagyon hasznos!
  9. 9. Eszközök• Találgatás helyett érdemes mérni!• Legjobb barátunk a profiler!• Rendszer-szintű mérőszámok is sokat segíthetnek• Pár hasznos segédprogram • Oprofile, perf, valgrind, pahole, gprof/gcov, time
  10. 10. Optimalizáljunk!• Feladat: – Szöveges fájl felolvasása – Soronként szöveg tokenizálása és tokenek számlálása, beépített naplózással• Cél: – Lehető legyorsabb futás• Nincs többszálúsítás!• Mit tegyünk?
  11. 11. Memória használat• Van, hogy a programunk túl sok memóriát eszik...• Valami sokat foglal?• Valamilyen objektumból túl sok van?• Valamit elfelejtünk felszabadítani?• Hogyan fogjunk neki?
  12. 12. syslog-ng queue-k• Cél: szálak között üzenetek átadása, sorrend helyesen, nagy mennyiségben• Triviális megoldás: – Queue használata lockolással• Probléma: – Nagy lock overhead – Sok várakozás üres, vagy teli queue esetén
  13. 13. syslog-ng queue-k• Több queue használata, batch szerűen• Lock nélküli fast-path és lock-olt slow-path Producer queue Consumer queue Wait queue Lock Lock
  14. 14. syslog-ng patterndb • Cél: – Bejövő különböző szöveges üzenetek real- time feldolgozása, klasszifikációja Legelterjedtebb megoldás a regexp-ek használata. – Sok minta esetén lassú és nehezen karbantarthatóAccepted publickey for marci from 127.0.0.1 port 37126 ssh2
  15. 15. syslog-ng patterndb• Célok: – Mintaillesztés ne függjön nagyban a minták számától – Egyszerű minta szintakszis• Megoldás: – Kereső fa építése a minták alapján – Változó részekhez “parserek” használataAccepted publickey for @STRING:username@ from@IPv4:source@ port @NUMBER:port@ ssh2
  16. 16. syslog-ng patterndb• Radix fa “literal” és “parser” elemekkel• Közel független a minták számától Accepted publickey for STRING: username from IPv4: source port
  17. 17. Konkluzió• Segédeszközök használata sokat könnyíthet• Folyamatos ellenőrzés, regressziók felderítése• Nem érdemes mindent sebességre optimalizálni• Folyamatos tanulás, tervezés fontossága• Környezet sajátosságaira érdemes figyelni• Használjuk az eszünket! :)
  18. 18. Kérdések? Köszönöm a figyelmet! Illés Márton illes.marton@balabit.hu http://marci.blogs.balabit.com/

×