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.
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
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.