Changes between Initial Version and Version 1 of Documentatie/Ontwikkelaar/Omgeving/Performance


Ignore:
Timestamp:
05/21/12 20:44:47 (14 years ago)
Author:
adriaan
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Documentatie/Ontwikkelaar/Omgeving/Performance

    v1 v1  
     1= Metingen = 
     2 
     3(''ook iets als "kwantitatieve software evaluatie"'') 
     4 
     5Om metingen op OpenAC zelf uit te kunnen voeren om zo een kwantitatief beeld te krijgen van de software, hebben we tools nodig om getallen te produceren op basis van de software. Deze pagina beschrijft sommige beschikbare en gebruikte tools. 
     6 
     7== Geheugengebruik == 
     8 
     9Het meest nauwkeurig voor geheugenmeting in Python onder Linux is [http://guppy-pe.sourceforge.net/#Heapy heapy], een tool om (interactief) de Python heap te onderzoeken. De handleiding voor heapy is nogal summier, maar er zit veel in de help binnen de module zelf. Met heapy kan je kijken hoeveel geheugen er gebruikt wordt, wat voor types het heeft, en ook zien welke veranderingen in het geheugen gebeuren als je bepaalde functionaliteit aanroept. 
     10 
     11=== Installatie van Heapy === 
     12 
     13Instructies voor '''OpenSUSE''' 
     14 
     15 - {{{zypper in python-devel}}} 
     16 - Je moet guppy waarschijnlijk van source compileren:  
     17   {{{ 
     18$ svn co https://guppy-pe.svn.sourceforge.net/svnroot/guppy-pe/trunk/guppy 
     19$ cd guppy 
     20$ python setup.py build  
     21$ sudo python setup.py install  
     22   }}} 
     23 
     24Vervolgens kan je de (nogal basic) [https://guppy-pe.svn.sourceforge.net/svnroot/guppy-pe/trunk/guppy heapy tutorial] volgen. 
     25  
     26=== Voorbeeldsessie Heapy === 
     27 
     28{{{ 
     29>>> from guppy import hpy; heap=hpy(); del hpy 
     30>>> heap.heap() 
     31Partition of a set of 26126 objects. Total size = 1889564 bytes. 
     32 Index  Count   %     Size   % Cumulative  % Kind (class / dict of class) 
     33     0  11935  46   728612  39    728612  39 str 
     34}}} 
     35 
     36Op dit moment -- met alleen Python gestart -- is er 1.8MB in gebruik, vooral strings. 
     37 
     38{{{ 
     39>>> heap.setref() 
     40>>> import logica 
     41[2012-03-17 01:04:19]:WARNING:openac:Functie doorvoer is deprecated bij callbacks maar zit nog in ModelBase 
     42>>> heap.heap() 
     43Partition of a set of 79843 objects. Total size = 6211716 bytes. 
     44 Index  Count   %     Size   % Cumulative  % Kind (class / dict of class) 
     45     0  37276  47  2880268  46   2880268  46 str 
     46     1  21661  27   846520  14   3726788  60 tuple 
     47}}} 
     48 
     49De ''setref()'' zorgt ervoor dat bij de volgende call we alleen nieuwe objecten zien. Het inlezen van module logica zorgt voor 6.2MB extra geheugen gebruik. 
     50 
     51{{{ 
     52>>> heap.setref() 
     53>>> logica.configuratie.lees() 
     54True 
     55>>> heap.heap() 
     56Partition of a set of 5493 objects. Total size = 461748 bytes. 
     57 Index  Count   %     Size   % Cumulative  % Kind (class / dict of class) 
     58     0    556  10   289120  63    289120  63 dict of include.primitieven.VrijObject 
     59     1   3767  69   134268  29    423388  92 str 
     60}}} 
     61 
     62Het inlezen van de configuratie van OpenAC gebruikt 461kB. Dat is misschien veel voor een bestand van 21kB grootte en 573 regels. We kunnen kijken hoe we bij al die nieuwe strings komen: 
     63 
     64{{{ 
     65>>> (heap.heap()&str).byvia 
     66Partition of a set of 3767 objects. Total size = 134276 bytes. 
     67 Index  Count   %     Size   % Cumulative  % Referred Via: 
     68     0    556  15    23704  18     23704  18 "['omschrijving']" 
     69     1    571  15    16000  12     39704  30 "['type']" 
     70     2    558  15    15656  12     55360  41 '.keys()[10]' 
     71     3    557  15    15608  12     70968  53 '.keys()[1]' 
     72}}} 
     73Hier zien we de weg (via) voor de strings die net zijn geladen. Daar zit niet zo veel verrassends in, behalve dat zo-te-zien er weinig sharing plaatsvindt. Een !VrijObject kost 520 bytes of meer (520 is de dict). Dat zie je met {{{(heap.heap()&dict).bysize}}}. 
     74 
     75Je kan ook met wat gefrobel ontdekken welke objecten het zijn: 
     76{{{ 
     77>>> v=heap.heap()&dict 
     78>>> v.byid  
     79Set of 711 <mixed> objects. Total size = 326520 bytes. 
     80 Index     Size   %   Cumulative  %   Brief 
     81     0     1672   0.5      1672   0.5 dict of class: ..TestEnv 
     82... 
     83>>> _.more 
     84... 
     85}}} 
     86Op deze manier kunnen we bladeren door de objecten in de set ''v'' (dat zijn dicts die recent aan de heap zijn toegevoegd). De lijst byid kunnen we indexeren om een specifiek object te vinden: 
     87{{{ 
     88>>> v.byid[39] 
     89Set of 1 <dict of include.primitieven.VrijObject> object. Total size = 520 bytes. 
     90 Index     Size   %   Cumulative  %   Owner Address 
     91     0      520 100.0       520 100.0 0x88a4d0c 
     92}}} 
     93Tot slot kunnen we ontdekken hoe we bij dit specifieke object kunnen komen: 
     94{{{ 
     95>>> v.byid[39].sp 
     96 0: heap.Root.i0_modules['logica.configuratie'].__dict__['variabelen'].__dict__['_data']['rapportage_export_folder'].__dict__ 
     97}}} 
     98Dus, ruwweg, hebben we hier {{{logica.configuratie.variabelen!['rapportage_export_folder']}}} te pakken -- of beter gezegd, de {{{__dict__}}} van het !VrijObject dat daardoor aangeduid wordt.