Crash Recovery

 News de pcdwarf.net  Commentaires fermés sur Crash Recovery
Mar 272010
 

Gros plantage dans le système de backup à cause d’un nombre de trop important de snapshots dans LVM
Le site à été récupéré à partir de la sauvegarde.

Mar 022010
 

pour modéliser la dispertion, on aura souvent besoin d’un generateur alléatoire gaussien qui concentre la majorité des valeurs sur la moyenne.

ci dessous une librairie de mon cru permettant d’obtennir ce resultat:

#include "pgl_random.hpp"

#include <stdlib.h>
#include <math.h>


static const int precision = 1000000000;  

double pgl_random(void)
{   return (double)(rand()%precision)/precision;
}

double pgl_random(const double max)
{   return max*pgl_random();
}

double pgl_random(const double min, const double max)
{   return min + pgl_random(max - min);
}

double pgl_random_gauss(void)
{   //cette fonction génère 2 nombres alléatoires
    //le second est stocké pour le prochain appel
        
    //les valeurs de retour sont centrées sur 0, equitablement réparties dessus dessous 
    //les valeurs sont essentiellement entre -3 et +3 

    double x1;
    double x2;
    double w;
    double y1;
    static double y2;
    static bool cache = false;

    if ( cache )
    {   cache=false;
        return y2;
    }

    do 
    {   x1 = pgl_random(-1, 1);
        x2 = pgl_random(-1, 1);
        w = x1 * x1 + x2 * x2;  //somme des carrés
    } while ( w >= 1.0 ); 

    w = sqrt( (-2.0 * log( w ) ) / w ); //attention log() est la fonction du log népérien ln. dans math.h le log classique est "log10"
    y1 = x1 * w;
    y2 = x2 * w;    //cette valeur est mise en cache pour le prochain appel
    cache = true;
    return y1;    
}



double pgl_random_gauss(const double centre, const double ecart)
{   return centre + ecart * pgl_random_gauss();
}

double pgl_random_gauss(const double ecart, const double min, const double max)
{   double centre = ( max - min ) /2 ;
    double r;
    do
    {
        r = centre + ecart * pgl_random_gauss();
    }   while ( r < min || r > max )
    return r;
}



Optimisation des sauts conditionnels

 Trucs et astuces techniques  Commentaires fermés sur Optimisation des sauts conditionnels
Mar 012010
 

Dans bien des cas, les opérations mathematiques sont plus rapides que les sauts conditionnels
exemple avec ces deux fonctions.

double foo(bool a, double b)
{   return a*b;
}

double bar(bool a, double b)
{   if ( a == true ) return b;
    else return 0;
}

la fonction foo est plus rapide que bar, ou en tout cas est plus facile à optimiser si on l’apelle un grand nombre de fois.

exemple pour 10 millions d’appels sur un processeur Intel(R) Core(TM)2 6300@1.86GHz

//sans optimisation
FOO temps  : 0.191716 sec
FOO temps  : 0.191693 sec
BAR temps  : 0.208786 sec
BAR temps  : 0.208999 sec
ecart : 8%

//optimisation O1
FOO temps  : 0.123257 sec
FOO temps  : 0.122524 sec
BAR temps  : 0.130222 sec
BAR temps  : 0.129852 sec
ecart : 5%

//optimisation O2
FOO temps  : 0.024811 sec
FOO temps  : 0.025352 sec
BAR temps  : 0.072986 sec
BAR temps  : 0.073545 sec
ecart : 66%


Remarque importante concernant l’optimisation :
Dans un programme digne de ce nom, il est inutile d’optimiser ce qui n’en a pas besoin, surtout si ça nuit à la lisibilité du code.
Généralement, les gains de vitesse proviendront de la complexité de l’algorythme utilisé plutôt que de la qualité du codage.
Généralement 90% des gains de vitesse possibles peuvent être obtennus en optimisant moins de 10% du code.
Aussi, ne réservez ce genre d’astuces qu’a de très petites portions de code et vérifiez que vos modifications ont un impact positif et suffisant pour justifier leur emploi.