Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 01/06/2013, à 12:05

Peter57

La fonction clock() de <ctime> ne fonctionne pas ! [Résolu]

j'ai un programme C++ qui tourne sans problème sur Mac (unix GCC) et pas sur linux.
La fonction clock() qui renvoit le nombre de clicks d'horloge renvoie systématiquement la valeur 0.0 !
Petit programme test :

#include <iostream>
#include<ctime>
using namespace std;

int main()
{
    clock_t t1;
    for(int i=0; i <10 ; i++){
        t1 = clock();
	cout << "temps : " << t1 << endl;
    }
    return 0;
}

Le temps en nombre de clicks est calculé en principe par la différence 'dt' des valeurs renvoyé par clock().
Le temps en secondes = 'dt/CLOCKS_PER_SEC'       (nb CLOCKS_PER_SEC est une constante prédéfinie);
résultat toujours 0.0 !

Dernière modification par Peter57 (Le 06/06/2013, à 17:13)

Hors ligne

#2 Le 04/06/2013, à 14:22

Bigcake

Re : La fonction clock() de <ctime> ne fonctionne pas ! [Résolu]

Bonjour,

J'ai fait un petit test, j'a le même résultat que toi avec ton code (sauf que je l'ai modifié en C)
En poussant un peu plus les tests, j'ai remarqué que il ne m'affichait un résultat que tout les 10000 :
Au debut j'au juste augmenté le nombre d'itérations, puis ajouté un usleep de 5000, puis au final, le prog c'est transformé en ça :

#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main()
{
  clock_t t1;
  int a, fd;

  fd = open("/dev/null", O_RDWR);
  for(int i=0; i <10000 ; i++){
    t1 = clock();
    for (a = 0; a < 50000; ++a)
      write(fd, "fjcj aejhbcehjb", 15);
    if (i % 100 == 0)
      printf("temps : %d\n", t1);;
  }
  return 0;
}

On voit que ça donne bien un résultat

man clock a écrit :

The clock() function shall return the implementation's best approximation to the processor time used by the process since the beginning of an implementation-defined era related only to the process invocation.

D'après mes tests; la précision de clock(), en gros, c'est de l'ordre de 10000

Ce qui serai interessant de trouver c'est s'il sagit d'une valeur modifiable ou fixé a la compilation du kernel, là, j'en ai aucune idée

Dernière modification par Bigcake (Le 04/06/2013, à 14:28)


"Les gens" ne sont pas cons, ils ont été habitués à la facilité et à la désinformation. Le meilleur moyen de ne pas les aider, c'est de se moquer. Le meilleur moyen de les aider, c'est de les informer, encore et encore. La réflexion viendra. N'oubliez pas que vous aussi, vous êtes le con d'un autre.
Smartphone+GNU/Linux=Librem5

Hors ligne

#3 Le 04/06/2013, à 15:46

Peter57

Re : La fonction clock() de <ctime> ne fonctionne pas ! [Résolu]

Bigcake a écrit :

D'après mes tests; la précision de clock(), en gros, c'est de l'ordre de 10000

Ce qui serai interessant de trouver c'est s'il sagit d'une valeur modifiable ou fixé a la compilation du kernel, là, j'en ai aucune idée

Effectivement sur mon programme original, j'ai des valeurs aléatoires à 1000 et 0 le reste du temps.
Sous Unix les valeurs renvoyées par clock s'incrémentent progressivement. Le programme test ci-dessus renvoie :

temps : 1712
temps : 1786
temps : 1792
temps : 1797
temps : 1802
temps : 1807
temps : 1811
temps : 1815
temps : 1820
temps : 1824

Hors ligne

#4 Le 06/06/2013, à 17:09

Peter57

Re : La fonction clock() de <ctime> ne fonctionne pas ! [Résolu]

J'ai fini par trouver la solution.
Sous linux, le résultat de la fonction clock() est incrémenté tous les 1/100è de seconde seulement !
Le résultat est exprimé en 1/1 000 000 è de secondes. C'est la raison de la précision de 10 000 trouvé par Bigcake.
Bravo pour la portabilité !
Impossible de s'en servir pour tester facilement l'efficacité du code.
Dommage !
D'autres surprises du même genre ?

Hors ligne

#5 Le 06/06/2013, à 18:48

grim7reaper

Re : La fonction clock() de <ctime> ne fonctionne pas ! [Résolu]

Salut,

Comme tu fais du C++, je te conseille de jeter un œil à std::chrono (disponible depuis C++11, sinon probablement via Boost pour C++03).
Petit exemple en reprenant ton code :

#include <iostream>
#include <chrono>

using std::chrono::duration_cast;
using std::chrono::microseconds;

typedef std::chrono::high_resolution_clock Clock;

int main()
{
    Clock::time_point t0 = Clock::now();
    for (int i = 0; i < 10; i++)
    {
        Clock::time_point t1 = Clock::now();
        std::cout << "elapsed: " << duration_cast<microseconds>(t1-t0).count() << "us\n";
        t0 = t1;
    }
    return 0;
}

Dernière modification par grim7reaper (Le 06/06/2013, à 18:51)

Hors ligne