Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Delphi Discussion :

Mesurer un temps d'éxécution - Incertitude


Sujet :

Langage Delphi

  1. #1
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    juillet 2006
    Messages
    11 465
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : juillet 2006
    Messages : 11 465
    Points : 19 723
    Points
    19 723
    Par défaut Mesurer un temps d'éxécution - Incertitude
    Voici le projet de mesure de temps : Test.Perf.const.param.zip

    A la base, juste vérifier entre le FastMM intégré dans Delphi 10 Sealte vs NexusMM en 64Bits uniquement quelques modifications de code
    Et ayant un nouveau code à appréhender, je note quelques optimisations comme le const sur les string en paramètre qui évite la copie pour améliorer le projet que je dois maintenant maintenir

    Le phénomène que j'observe et qui m'emmerde particulièrement pour mesurer des variantes plus ou moins rapides d'une fonction est qu'en lançant plusieurs fois de suite la même boucle autour d'une fonction, cela va de plus en plus vite.
    Parfois c'est moins marqué mais j'ai quand même très souvent, cette forme de temps décroissant
    A chaque clic, cela repart sur un temps de base puis ça décroit (pas toujours)

    Comment savoir ce qui fonctionne vraiment plus vite si cela dépend de l'humeur du CPU à l'instant T (est-ce qu'un très grand nombre de répétition peut niveler cela, mais je vais pas attendre des heures pour savoir si ma modification est pertinente ou pas)

    Essai en FastMM, une seule instance, trois clic consecutifs

    Premier Clic
    Compare Param Const && Copy : x 1000000 / Len = 10 = 1234567890
    Const : 00:00:00:009
    Copy : 00:00:00:086
    Const 2 : 00:00:00:009
    Copy 2 : 00:00:00:086
    Txxx_EncodeSendText : 00:00:02:765
    Txxx_EncodeSendText 2 : 00:00:01:660
    Txxx_EncodeSendText 3 : 00:00:01:288
    Txxx_EncodeSendText 4 : 00:00:01:091
    la seconde

    Compare Param Const && Copy : x 1000000 / Len = 10 = 1234567890
    Const : 00:00:00:009
    Copy : 00:00:00:086
    Const 2 : 00:00:00:009
    Copy 2 : 00:00:00:086
    Txxx_EncodeSendText : 00:00:02:643
    Txxx_EncodeSendText 2 : 00:00:01:623
    Txxx_EncodeSendText 3 : 00:00:02:525
    Txxx_EncodeSendText 4 : 00:00:02:032
    La troisième
    Compare Param Const && Copy : x 1000000 / Len = 10 = 1234567890
    Const : 00:00:00:010
    Copy : 00:00:00:089
    Const 2 : 00:00:00:009
    Copy 2 : 00:00:00:086
    Txxx_EncodeSendText : 00:00:02:450
    Txxx_EncodeSendText 2 : 00:00:01:568
    Txxx_EncodeSendText 3 : 00:00:01:247
    Txxx_EncodeSendText 4 : 00:00:02:538

    J'ai essayé différente façon de l'écrire, comme mettre le code à tester dans une sous-fonction, toujours ce phénomène
    Il est donc impossible de savoir si c'est le hasard de tomber sur une bonne humeur du CPU si l'on enchaine une version A puis une B puisque entre A et A, il y a des une différence

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    procedure TTestPerfConstParamMainForm.btnCompareConstOrCopyClick(Sender: TObject);
    var
      Laps: TLaps;
     
      procedure AddLap(const ATitle: string; ADelay: Int64);
      begin
        Laps.Add(ATitle, ADelay);
        MemoTimes.Lines.Add(Format('%s : %s', [ATitle, FormatMS(ADelay)]));
      end;
     
    var
      Tick: Int64;
      Lap: TLap;
      LapArray: TArray<TLap>;
      LapKeeper: TLapKeeper;
      SL: TStringList;
     
      procedure Test_CallConstString(const S: string; const ATitle: string);
      var
        I: Integer;
      begin
        GetBeginTime(Tick);
        for I := 1 to 1000 * TrackBarRepetition.Position do
          CallConstString(S);
        AddLap(ATitle, ElapsedTime(Tick));
      end;
     
      procedure Test_CallCopyString(const S: string; const ATitle: string);
      var
        I: Integer;
      begin
        GetBeginTime(Tick);
        for I := 1 to 1000 * TrackBarRepetition.Position do
          CallCopyString(S);
        AddLap(ATitle, ElapsedTime(Tick));
      end;
     
      procedure Test_TxxxBaseServerSocket_EncodeSendText(const S: string; const ATitle: string);
      var
        I: Integer;
        S3: string;
      begin
        GetBeginTime(Tick);
        for I := 1 to 1000 * TrackBarRepetition.Position do
          S3 := TxxxBaseServerSocket_EncodeSendText(S);
        AddLap(ATitle, ElapsedTime(Tick));
      end;
     
    var
      I: Integer;
      S, S2: string;
    begin
      Laps := TLaps.Create();
      try
        MemoTimes.Lines.Clear();
     
     
        for I := 1 to TrackBarStringSize.Position do
          S := S + Chr(Ord('0') + I mod 10);
        S2 := S;
     
        MemoTimes.Lines.Add(Format('%s : x %d / Len = %d = %s', [TButton(Sender).Caption, 1000 * TrackBarRepetition.Position, TrackBarStringSize.Position, S]));
        MemoTimes.Refresh();
     
        Test_CallConstString(S2, 'Const');
        Test_CallCopyString(S2, 'Copy');
     
        Test_CallConstString(S2, 'Const 2');
        Test_CallCopyString(S2, 'Copy 2');
     
        Test_TxxxBaseServerSocket_EncodeSendText(S2, 'TxxxBaseServerSocket_EncodeSendText');
        Test_TxxxBaseServerSocket_EncodeSendText(S2, 'TxxxBaseServerSocket_EncodeSendText 2');
        Test_TxxxBaseServerSocket_EncodeSendText(S2, 'TxxxBaseServerSocket_EncodeSendText 3');
        Test_TxxxBaseServerSocket_EncodeSendText(S2, 'TxxxBaseServerSocket_EncodeSendText 4');
     
        MemoTimes.Lines.Add(TButton(Sender).Caption + ' -  Classement');
        LapArray := Laps.ToArray();
        TArray.Sort<TLap>(LapArray, TLapComparer.Create());
        for Lap in LapArray do
        begin
          MemoTimes.Lines.Add(Format('%s : %s', [Lap.Key, FormatMS(Lap.Value)]));  
          vleTimes.Values[Lap.Key] := IntToStr(Lap.Value);
          I := vleTimes.Strings.IndexOfName(Lap.Key);
          LapKeeper := TLapKeeper(vleTimes.Strings.Objects[I]);
          if not Assigned(LapKeeper) then
          begin
            LapKeeper := TLapKeeper.Create();
            vleTimes.Strings.Objects[I] := LapKeeper;
          end;
          vleTimes.Values[Lap.Key] := vleTimes.Values[Lap.Key] + ' | ' + FormatMS(LapKeeper.Add(Lap.Value));
        end;  
     
        SL := TStringList.Create();
        try
          SL.AddStrings(vleTimes.Strings);
          SL.CustomSort(TLapKeeper.CompareForCustomSort);
          vleTimes.Strings := SL;
        finally
          SL.Free();
        end;
     
      finally
        Laps.Free();
      end;
    end;

    En Nexus, ce test est mortel mais est-ce vrai ?
    Compare Param Const && Copy : x 1000000 / Len = 10 = 1234567890
    Const : 00:00:00:004
    Copy : 00:00:00:058
    Const 2 : 00:00:00:004
    Copy 2 : 00:00:00:056
    TxxxBaseServerSocket_EncodeSendText : 00:00:05:623
    TxxxBaseServerSocket_EncodeSendText 2 : 00:00:04:894
    TxxxBaseServerSocket_EncodeSendText 3 : 00:00:05:792
    TxxxBaseServerSocket_EncodeSendText 4 : 00:00:07:161


    Comment expliquer ces temps si variable pour le même code lancé de façon rapproché
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  2. #2
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    mars 2006
    Messages
    1 199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : mars 2006
    Messages : 1 199
    Points : 2 254
    Points
    2 254
    Billets dans le blog
    6
    Par défaut
    Voici les résultats sur mon PC sous Windows 10 compilé avec XE7 a peu près stable sur 3 essais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    Compare Param Const && Copy : x 1000000 / Len = 10 = 1234567890
    Const : 00:00:00:003
    Copy : 00:00:00:016
    Const 2 : 00:00:00:002
    Copy 2 : 00:00:00:016
    TxxxBaseServerSocket_EncodeSendText : 00:00:00:341
    TxxxBaseServerSocket_EncodeSendText 2 : 00:00:00:340
    TxxxBaseServerSocket_EncodeSendText 3 : 00:00:00:341
    TxxxBaseServerSocket_EncodeSendText 4 : 00:00:00:341
    Compare Param Const && Copy -  Classement
    Const 2 : 00:00:00:002
    Const : 00:00:00:003
    Copy 2 : 00:00:00:016
    Copy : 00:00:00:016
    TxxxBaseServerSocket_EncodeSendText 2 : 00:00:00:340
    TxxxBaseServerSocket_EncodeSendText : 00:00:00:341
    TxxxBaseServerSocket_EncodeSendText 4 : 00:00:00:341
    TxxxBaseServerSocket_EncodeSendText 3 : 00:00:00:341

  3. #3
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    juillet 2006
    Messages
    11 465
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : juillet 2006
    Messages : 11 465
    Points : 19 723
    Points
    19 723
    Par défaut
    Merci,

    Je soupçonne Sophos d'être coupable d'irrégularité de performance
    sans compter que je trouve la machine (nouveau job) particulièrement lente
    DELL Precision T1700 Intel® Core™ i7-4790 avec 32Go de RAM avec Win10
    j'ai l'impression d'avoir une machine virtuelle à l'autre bout du monde par moment !

    Quand je vois tes temps, 6-8 fois meilleur et stable c'est que mon poste de travail à un soucis par rapport à tes chiffres, soit tu as un monstre, soit il y a un loup
    C'est exactement à ce quoi je m'attend, cela dure le même temps pour la même tache dans un contexte d'exécution qui n'évolue pas

    Compilé en XE2, 32bits, juste IndyTextEncoding_UTF8.GetByteCount(AStr) devient TIdTextEncoding.UTF8.GetByteCount(AStr),
    j'ai aussi ce phénomène d'amélioration au fil des lancements.
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  4. #4
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    mars 2006
    Messages
    1 199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : mars 2006
    Messages : 1 199
    Points : 2 254
    Points
    2 254
    Billets dans le blog
    6
    Par défaut
    Voici ma config
    Nom : Annotation 2019-11-06 120737.png
Affichages : 86
Taille : 61,7 Ko

  5. #5
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    juillet 2006
    Messages
    11 465
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : juillet 2006
    Messages : 11 465
    Points : 19 723
    Points
    19 723
    Par défaut
    C'est un processeur plus récent, gravé plus fin, plus économe et plus rapide
    mais pour ce pauvre test qui ne sollicite qu'un seul core, j'aurais compris jusqu'à 2x plus rapide (en vrai plutôt 1.25x) mais pas 3x à 7x plus rapide selon l'humeur du CPU.

    Lorsque j'aurais le temps, je le ferais testé par d'autres collègues, déjà par mon responsable DELPHI qui est un peu dans le jus pour une version, il n'a pas trop le temps de s'occuper de mon poste qui ne peut pas encore faire tourner le produit.
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  6. #6
    Membre actif Avatar de Galet
    Homme Profil pro
    Consultant/Programmeur Robotique industrielle
    Inscrit en
    mars 2010
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant/Programmeur Robotique industrielle

    Informations forums :
    Inscription : mars 2010
    Messages : 103
    Points : 206
    Points
    206
    Par défaut
    Si cela peut te faire progresser dans ton enquête :
    Nom : Test1.PNG
Affichages : 74
Taille : 12,1 Ko
    avec :
    Nom : Test2.PNG
Affichages : 74
Taille : 14,6 Ko
    ...
    Les valeurs sont très stables...
    Cordialement,
    Windows 7 / Delphi Tokyo
    "Les choses ne changent pas. Change ta façon de les voir, cela suffit" Lao Tseu

  7. #7
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    juillet 2006
    Messages
    11 465
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : juillet 2006
    Messages : 11 465
    Points : 19 723
    Points
    19 723
    Par défaut
    Merci,
    Ton processeur est une version mobile, assez proche en génération, nous devrions avoir des temps semblables.

    Oui, cela penche dans mes habitudes que les temps sont stables et donc comparables, pas soumis aux caprices aléatoires d'un bug qui grignotent le silicium.
    Dès que je mon responsable à un peu de temps ou si il me laisse accès à sa machine, je ferais des essais.

    Super, si mon taf est de trouver des optimisations sur d'anciens codes D7/XE2/C#.Net à migrer en 64bits D10.0,
    je vais le savoir comment si c'est plus performant ou pas ce que je fais !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  8. #8
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    juillet 2006
    Messages
    11 465
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : juillet 2006
    Messages : 11 465
    Points : 19 723
    Points
    19 723
    Par défaut
    Comme j'ai du temps à perdre
    Je viens de redémarrer deux fois, je lance directement mon programme et miracle c'est cohérent pendant moins d'une minute
    Après cela redevient la merde donc cela confirmes mes soupçons d'un process CPUPhage, je vais le traquer même si je sens que c'est Sophos, le nouveau Kasperchier !

    Compare Param Const && Copy : x 1000000 / Len = 10 = 1234567890
    Const : 00:00:00:001
    Copy : 00:00:00:018
    Const 2 : 00:00:00:001
    Copy 2 : 00:00:00:018
    TxxxBaseServerSocket_EncodeSendText : 00:00:00:789
    TxxxBaseServerSocket_EncodeSendText_Q : 00:00:00:786
    TxxxBaseServerSocket_EncodeSendText 2 : 00:00:00:785
    TxxxBaseServerSocket_EncodeSendText_Q 2 : 00:00:00:783
    TxxxBaseServerSocket_EncodeSendText 3 : 00:00:00:786
    TxxxBaseServerSocket_EncodeSendText_Q 3 : 00:00:00:789
    TxxxBaseServerSocket_EncodeSendText 4 : 00:00:00:821
    TxxxBaseServerSocket_EncodeSendText_Q 4 : 00:00:00:803
    Compare Param Const && Copy - Classement
    Const : 00:00:00:001
    Const 2 : 00:00:00:001
    Copy 2 : 00:00:00:018
    Copy : 00:00:00:018
    TxxxBaseServerSocket_EncodeSendText_Q 2 : 00:00:00:783
    TxxxBaseServerSocket_EncodeSendText 2 : 00:00:00:785
    TxxxBaseServerSocket_EncodeSendText 3 : 00:00:00:786
    TxxxBaseServerSocket_EncodeSendText_Q : 00:00:00:786
    TxxxBaseServerSocket_EncodeSendText : 00:00:00:789
    TxxxBaseServerSocket_EncodeSendText_Q 3 : 00:00:00:789
    TxxxBaseServerSocket_EncodeSendText_Q 4 : 00:00:00:803
    TxxxBaseServerSocket_EncodeSendText 4 : 00:00:00:821

    La 3ème : la sublime
    Compare Param Const && Copy : x 1000000 / Len = 10 = 1234567890
    Const : 00:00:00:001
    Copy : 00:00:00:018
    Const 2 : 00:00:00:001
    Copy 2 : 00:00:00:018
    TxxxBaseServerSocket_EncodeSendText : 00:00:00:782
    TxxxBaseServerSocket_EncodeSendText_Q : 00:00:00:782
    TxxxBaseServerSocket_EncodeSendText 2 : 00:00:00:782
    TxxxBaseServerSocket_EncodeSendText_Q 2 : 00:00:00:781
    TxxxBaseServerSocket_EncodeSendText 3 : 00:00:00:782
    TxxxBaseServerSocket_EncodeSendText_Q 3 : 00:00:00:781
    TxxxBaseServerSocket_EncodeSendText 4 : 00:00:00:782
    TxxxBaseServerSocket_EncodeSendText_Q 4 : 00:00:00:782
    Compare Param Const && Copy - Classement
    Const : 00:00:00:001
    Const 2 : 00:00:00:001
    Copy 2 : 00:00:00:018
    Copy : 00:00:00:018
    TxxxBaseServerSocket_EncodeSendText_Q 2 : 00:00:00:781
    TxxxBaseServerSocket_EncodeSendText_Q 3 : 00:00:00:781
    TxxxBaseServerSocket_EncodeSendText 3 : 00:00:00:782
    TxxxBaseServerSocket_EncodeSendText_Q 4 : 00:00:00:782
    TxxxBaseServerSocket_EncodeSendText : 00:00:00:782
    TxxxBaseServerSocket_EncodeSendText 4 : 00:00:00:782
    TxxxBaseServerSocket_EncodeSendText_Q : 00:00:00:782
    TxxxBaseServerSocket_EncodeSendText 2 : 00:00:00:782
    A la 5ème, retour à la merde !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

Discussions similaires

  1. [Test][Perf]Mesure du temps d'execution différente 2 fois de suite
    Par debdev dans le forum Tests et Performance
    Réponses: 11
    Dernier message: 22/07/2005, 13h04
  2. temps d'éxécution et ressources
    Par Tchinkatchuk dans le forum Décisions SGBD
    Réponses: 5
    Dernier message: 12/04/2005, 10h11
  3. [info] mesure du temps
    Par nicolas581 dans le forum APIs
    Réponses: 3
    Dernier message: 02/08/2004, 14h45
  4. [MFC] : CTime ? Calcul de temps d'éxécution
    Par jonzuzu dans le forum MFC
    Réponses: 10
    Dernier message: 25/05/2004, 15h22
  5. Mesurer le temps des instructions
    Par luckylucke dans le forum Assembleur
    Réponses: 9
    Dernier message: 03/09/2003, 22h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo