2013-09-02 5 views
1

J'essaie de vérifier le temps passé dans deux fonctions pour les comparer.Benchmarking Deux fonctions

Les fonctions prennent deux contre-initiateurs comme entrées.

ces deux sont appelés à l'intérieur d'une fonction.

void b_mark() 
{ 
    for(int i=0;i<10;i++) 
    { 
     timer1.start(); 
     function1(std::back_inserter(itr1)); 
     timer1.stop(); 


     timer2.start(); 
     function2(std::back_inserter(itr2)); 
     timer2.stop(); 

    } 
} 

Il se trouve que la fonction que j'appelle d'abord prend plus de temps et n'a pas d'importance si elle est function1 ou fonction2.

Quelle peut être la raison générale?

Le temporisateur est un wrapper à std::clock().

+0

Code de minuterie serait plus utile ici. Une bonne probabilité de trouver le problème réside dans le code temporisateur. – virusrocks

Répondre

1

Le temps que vous mesurez inclut le temps pour std::back_inserter(...). Se pourrait-il que cela prenne plus de temps la première fois que vous l'appelez, par ex. pour l'initialisation?

+0

Je ne pense pas parce que les résultats sont identiques pour les deux listes. –

1

whenver vous voulez mesurer quelque chose, vous devez vous assurer que:

  • chaque situation de mesure est exactement le même que tous les autres - ce qui comprend la génération de données mêmes de démarrage, la fermeture de ressources ouvertes avant de les ouvrir à nouveau, etc
  • vous répéter les temps assez étape mesurée, de sorte que les résultats sont a) mesurables, b) statistiquement significatives
  • les fonctions de mesure/objets eux-mêmes sont corrects

Dans votre cas, je soupçonne que:

  • on mesure une fois par appel de fonction, ce qui peut rendre le résultat dénué de sens - soit à cause de la résolution de l'horloge système, l'allocation des ressources du système - et probablement pour beaucoup d'autres raisons
  • vous
  • peut fonctionner sur la même collection, qui peut être modifiée pendant le premier appel; le premier appel peut, par exemple, allouer une grande quantité de mémoire dans la collection, tandis que le second ne l'utilise que
  • votre classe timer peut être incorrect et provoquer le résultat est invalide

En bref: cette Le cas de test ne semble pas fiable et ses résultats risquent d'être invalides.

Essayez de modifier le code comme ceci:

void b_mark() 
{ 
    int count = 10000; 
    timer1.start(); 
    for(int i=0;i<count;i++) 
    { 
     resetItr(itr1); 
     function1(std::back_inserter(itr1)); 
    } 
    timer1.stop(); 


    timer2.start(); 
    for(int i=0;i<count;i++) 
    { 
     resetItr(itr2); 
     function2(std::back_inserter(itr2)); 
    } 
    timer2.stop(); 
} 
+0

En fait, je l'ai testé pour environ 100 tests. A l'intérieur de la fonction rien n'a été modifié autre que les listes std :: fournies qui sont différentes. La minuterie n'a pas de problèmes impliqués. –

+0

@cowboy 100 tests peuvent être rien pour une fonction qui prend plusieurs nanosecondes. – Dariusz

+0

Enfait cela prend quelques secondes donc je crois que c'est assez, n'est-ce pas? Je ne sais pas si cela est dû au manque de mémoire. Mais la chose est la 1ère fonction est celle qui est lente. –