page header

januari 2012 Archieven

Performance: If statements elimineren


Geplaatst door martijn_brekhof op 2012-01-13 11:35:21 | Permanente link | Categorie: Programmeren | Reacties: 0

Ik was in de blog Performance: lazy evaluation begonnen met het optimaliseren van onderstaand loopje.

for ( bug_number = 0; bug_number < MAX_BUGS; bug_number++ )
{
  for ( employee_id = 0; employee_id < MAX_EMPLOYEES; employee_id++ )
  {
    if( ( employee_employed[employee_id] == false ) && (employee_id == bug_assignee[bug_number]) )
    {
      printf("Bug %d assigned to non employed person\n", bug_number);
    }
  }
}

Door simpelweg de condities in de if-statement om te draaien behaalde ik een winst van 76%. In de blog Loopjes, loopjes, loopjes ging ik verder in op bovenstaand stukje code waar ik vooral de for loop onder de loep nam. Door simpelweg de binnenste loop alleen uit te voeren als het een medewerker betreft die niet meer in dienst is, behaalde ik een extra winst van 1 seconde. De uiteindelijke code laat ik hier voor het gemak nog even zien:

for ( employee_id = 0; employee_id < MAX_EMPLOYEES; employee_id++ )
{
  if (employee_employed[employee_id] == false)
  {
    for ( bug_number = 0; bug_number < MAX_BUGS; bug_number++ )
    {
      if (employee_id == bug_assignee[bug_number])
      {
        printf("Bug %d assigned to non employed person\n", bug_number);
      }
    }
  }
}

Ik zal nu de (voor mij) laatste slag in de optimalisatie van de code behandelen. Door het herschrijven van de code viel me namelijk iets anders op. Wellicht dat het je al was opgevallen, maar de twee if-statements gebruiken allebei de variabele employee_id.
De lijst bug_assignee geeft een employee_id terug en de lijst employee_employed geeft op basis van employee_id aan of deze nog in dienst is. Ik had in de blog Performance: lazy evaluation al aangegeven dat een bug altijd toegewezen is aan één persoon. Oftewel bug_assignee geeft altijd een valide medewerkersnummer terug (employee_id). We hoeven hier dus helemaal niet expliciet op te controleren en kunnen de twee for loops herschrijven tot één:

for ( bug_number = 0; bug_number < MAX_BUGS; bug_number++ )
{
  employee_id = bug_assignee[bug_number];
  if( employee_employed[employee_id] == false )
  {
    printf("Bug %d assigned to non employed person\n", bug_number);
  }
}

De code is nu een stuk leesbaarder (vind ik in ieder geval) en doet er nog maar 0.3 seconden over. Dit is dus uiteindelijk een winst van 99% ten opzichte van de code in mijn blog Performance: lazy evaluation.

Geluiden uit de keuken van Fedora (december)


Geplaatst door martijn_brekhof op 2012-01-02 13:54:42 | Permanente link | Categorie: Systeembeheer | Reacties: 0

In de keuken van Debian werd er niets besproken dat ik noemenswaardig vond en daarom beperk ik me deze keer tot alleen de geluiden uit de keuken van Fedora.

Andreas Tunek vraagt zich af of Fedora 17 weer bootable kan worden gemaakt op Macs (link). Fedora 15 werkte wel op Macs maar Fedora 16 weigert te installeren of na een upgrade van 15 te booten. Adam Williamson geeft aan dat hiervoor EFI ondersteuning voor het booten en voor anaconda (installer) moet worden ontwikkeld (link).

Giovanni Campagna vindt dat Fedora een goede tool mist om applicaties mee te installeren. Hij doelt hiermee op een tool dat het voor eindgebruikers makkelijk maakt om een gewenste applicatie te vinden en noemt als voorbeeld Ubuntu Software Center (link). Na veel positieve feedback heeft Giovanni Campagna besloten er een officiële feature voor Fedora 17 van te maken (link).

Eric Smith geeft aan dat hij bezig is om MATE voor Fedora te packagen. MATE is een fork van GNOME 2 en hij vraagt zich af of er veel animo is voor MATE. Hoewel er nogal wat gebruikers van Fedora zijn die GNOME 3 maar niets vinden is er ook maar weinig animo voor MATE. Dit komt vooral omdat het er niet naar uitziet dat MATE erg actief wordt ontwikkeld (link).