Geschiedenis van de kwestie
Naarmate programma's complexer worden en de belasting toeneemt, hebben Perl-ontwikkelaars de behoefte om knelpunten te analyseren en scripts te optimaliseren. Hiervoor zijn ingebouwde profilers ontwikkeld, zoals Devel::NYTProf, Devel::DProf, en verschillende manieren van handmatige metingen via Benchmark.
Probleem
De belangrijkste moeilijkheid is dat Perl bekend staat om zijn dynamiek en flexibiliteit, wat extra overhead met zich meebrengt (on-the-fly code interpretatie, frequente typeconversies, laag niveau geheugentoegang, autovivificatie van structuren). Het is niet altijd duidelijk welk stuk code het traagste wordt, omdat de bottleneck vaak niet daar is waar de ontwikkelaar zoekt. Een verkeerd uitgangspunt is prematuurlijke optimalisatie zonder feitelijke profilering.
Oplossing
Gebruik een profiler, bouw rapporten op, werk met statistieken. NYTProf biedt de meest gedetailleerde informatie en ondersteunt grafische analyse. Voor sommige gerichte metingen worden Benchmark::Timer of time gebruikt. De code wordt geoptimaliseerd op basis van de resultaten - bijvoorbeeld door overbodige logica te herschrijven, onnodige array-kopieën te verwijderen, en XS-wrapper te implementeren op kritieke plaatsen.
Voorbeeldcode:
# profileren via Devel::NYTProf perl -d:NYTProf myscript.pl nytprofhtml # HTML-rapport met details
Belangrijke kenmerken:
Toont een profiler altijd de exacte oorzaak van vertraging in elk segment?
Nee. Een profiler kan op sommige plaatsen een vertekend beeld geven, vooral als zelden aangeroepen functies worden geanalyseerd, of als er gewerkt wordt met externe bronnen (DB, netwerk).
Kan men stellen dat XS-binding altijd de maximale prestatieverbetering oplevert?
Niet altijd. XS versnelt alleen compute-intense fragmenten, maar als de bottleneck I/O of de gegevensstructuur is, zal de verbetering minimaal zijn.
Moet men altijd de traagste functies herschrijven in C of XS na de eerste analyse?
Nee. Vaak is het beter om het algoritme of de manier van gegevensopslag aan te passen (autovivificatie vs preallocate, array vs hash), dan direct naar low-level optimalisatie te gaan.
Een ontwikkelaar probeert functies willekeurig te versnellen, herschrijft ze naar XS, maar ziet geen professionele groei in snelheid omdat de belangrijkste bottleneck in meervoudig lezen van bestanden lag.
Voordelen:
Nadelen:
Profilering via NYTProf, identificatie van de echte trage fragmenten, alleen deze optimaliseren, en op de rest het algoritme herschrijven naar een efficiëntere. De relationele aspecten van de code-deelnemers toonden waar er onnodige array-kopieën waren.
Voordelen:
Nadelen: