2005-10-14
 
häck
HELSINKI - Donderdag en vrijdage - lange werkdagen, negen tot negen. En van alles wat: vergaderen, code schrijven, Fins leren, telefoneren, e-mails beantwoorden, rapporten schrijven, ... Maar nu is het eindelijk gedaan, zodat ik me kan storten op m'n werk voor het weekend :-) AC is in Duitsland voor familieredenen, dus ik heb alle ruimte en tijd om me een beetje te ontspannen (met ander werk!)

Ik zie dat de Nederlandse wikipedia meer dan 100.000 artikelen heeft - gefeliciteerd! Een grote prestatie. Ik moet echter zeggen dat ik vaak de Engelstalige prefereer, zelfs voor 'Nederlandse' onderwerpen. Maar goed, het is een geweldige prestatie.

Als ik deze blog geschreven heb, neem ik nog een Vana Tallinn en dan ga ik slapen... Zzzzz..

Ik sprak al eerder over het optimaliseren van software, toen in het kader van geheugengebruik. De afgelopen dagen heb ik me echter gericht op de snelheid. Computergod Donald Knuth schreef ooit: "Premature optimization is the root of all evil". Met andere woorden - zorg er eerst voor dat je precies weet waar je programma de meeste tijd doorbrengt, en ga dat optimaliseren. Het 10x zo snel maken van een stukje code dat 1% van je totale tijd bedraagt is niet zo interessant. Maar hoe vind ik die interessante hotspots in de tienduizenden regels code?

Knuth is Amerikaan, maar wij hebben Edsger Dijkstra. Ik ontdekte dat de VPRO een online-video heeft van een interview met hem (uit 2001)

Maandag las ik Federico's blog (lees ook zijn presentatie) over sysprof. Sysprof is een programma dat een overzicht geeft van de processen op je systeem, en hoeveel tijd besteed wordt per functie. Een en ander wordt weergegeven in een boomstructuur, zodat ik functies kan 'uitklappen', en de tijd van de daarin aangeroepen functies kan zien. Heel erg handig. Federico's blog geeft een aardig overzicht van het gebruik. De user-interface is wat Spartaans, maar dat belette mij niet er zeer goed gebruik van te maken.

In een stresstest (goede manier om problemen te vinden!) van een bepaald stuk software, duurde het volledig starten 13 seconden. Met behulp van sysprof vond ik de boosdoener: elementen werden aan een lijst toegevoegd, maar eerst werd nog even gekeken of ze misschien al aanwezig waren door het nieuwe element met alle andere te vergelijken - een O(n2)-algoritme. Ik gebruikte een hash table om de zaak te versnellen. GHashTable zegt niets over de complexiteit, maar die is normaalgesproken O(1) (en O(n) in het slechtste geval). In ieder geval, de startup-time ging van 13 naar 3 seconden!

Het intellectueel interessante deel is natuurlijk het stuk tussen het vinden van de bottle-neck en het vinden van een oplossing. Da's soms makkelijk en soms moeilijk. Soms kan algoritmische complexiteit teruggebracht worden (zoals hierboven), soms is het het vermijden van het alloceren van dynamisch geheugen, soms kunnen in plaats van case-insensitive UTF-8 vergelijkingen ook normale strcmp's gebruikt worden, soms ..., enzovoort. Dit is het creatieve, leuke deel. Met name als het lukt :-)

Samengevat: sysprof is een nuttig stuk gereedschap. Ik vind het wat fijner werken dan, zeg, gprof; het vereist geen hercompilaties (maar wel een kernelmodule), en kan alle processen in het systeem bekijken. Het is bovendien een statische profiler (d.w.z., er wordt periodiek gekeken wat de processor aan het doen is). zodat de performance van programma's er ook al te zeer onder lijdt (zoals bij valgrind en vrienden - die ook erg nuttig zijn, overigens). Ondanks Knuths wijze woorden is het wel belangrijk bij het schrijven van software de performance een beetje in de gaten te houden; het kost altijd meer moeite om dat achteraf te doen, en als er oop ontwerpniveau geen aandacht aan besteed wordt, kan het erg lastig worden. In mijn geval - embedded software - is het ook niet mogelijk simpelweg snellere hardware te kopen...


0 Reacties:

Een reactie plaatsen


Emacs, the UberEditor Powered by Blogger