CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[c++]timer retourne toujours zéro!

jvfdp
jvfdp
Niveau 7
19 mai 2011 à 17:51:58

:salut:

Voilà, j'ai un petit problème...
Je voudrai faire un code simple qui me retourne le temps passé (c'est pour calculer la rapidité d'un code!).
Autant vous dire que j'ai besoin que ça soit très précis (millisecondes par exemple).

Le soucis c'est que cela me retourne toujours "0"!

  1. include <iostream>
  2. include <time.h>

using namespace std;

int main()
{
clock_t start, end;
int nbr;
start = clock();
cin >> nbr;
cout << nbr << endl;
end = clock();

cout << "Début :" << start << endl;
cout << "Fin :" << end << endl;
cout << "Total: " << end - start << endl;
}

godrik
godrik
Niveau 30
19 mai 2011 à 19:54:49

The clock() function returns an approximation of *processor* time used by the program.

Ce que tu veux est gettimeofday

Pocolo
Pocolo
Niveau 10
19 mai 2011 à 21:30:15

Pourtant en général on utilise bien clock() pour calculer le temps d’exécution du code non?

godrik
godrik
Niveau 30
19 mai 2011 à 22:24:27

clock retourne le temps processeur utilise par le processus. Le manuel n'est pas completement clair, mais j'imagine que ca ne compte pas le temps systeme, juste le temps passe en userspace. Du fait, si le processus ne fait rien, aucun temps n'est compte.

Pour avoir un decompte precis, on prefere time. Pour avoir le temps a l'horloge on utilise gettimeofday.

jvfdp
jvfdp
Niveau 7
20 mai 2011 à 13:04:01

:salut: c'est encore moi...

J'ai donc fais la même chose avec time:

  1. include <iostream>
  2. include <time.h>

using namespace std;

int main()
{
time_t start, end;
int nbr;
start = time(NULL);
cin >> nbr;
cout << nbr << endl;
end = time(NULL);

cout << "Début :" << start << endl;
cout << "Fin :" << end << endl;
cout << "Total: " << end - start << endl;
}

Et ça fonctionne bien! Le problème c'est que le résultat est en secondes et moi je veux du microsecondes...
(parce-que je vais faire des tests précis et pas comme dans ce cas là, où on attend une entrée clavier!)

godrik
godrik
Niveau 30
20 mai 2011 à 14:35:58

man gettimeofday

Pocolo
Pocolo
Niveau 10
20 mai 2011 à 14:42:46

C'est une fonction Linux ça il me semble (dont l'equivalent serait bien time() sur Windows).

godrik
godrik
Niveau 30
20 mai 2011 à 16:46:02

mmm, je pensais plus qu'il y avait des gens qui programmait sous windows :)

gettimeofday fournit l'information en secondes et millisecondes sous linux. de memoire time a le meme comportement sous linux et sous windows et retourne le temps en secondes.

jvfdp
jvfdp
Niveau 7
20 mai 2011 à 17:45:38

Bon, ça marche...

J'ai fais ça:

  1. include <iostream>
  2. include <sys/time.h> // 'faut faire gaffe c'est pas le même include!

using namespace std;

int main()
{
timeval start, end;
int nbr;
unsigned long aaa,bbb;
gettimeofday(&start, NULL);
cin >> nbr;
cout << nbr << endl;
gettimeofday(&end, NULL);
aaa = start.tv_usec; // pour les microsecondes = usec.
bbb = end.tv_usec;

cout << "Début :" << aaa << endl;
cout << "Fin :" << bbb << endl;
cout << "Total: " << bbb - aaa << endl;
}

Et oui je suis sous linux... :)

jvfdp
jvfdp
Niveau 7
20 mai 2011 à 17:50:55

Heu correction, il me met des résultats aléatoires parfois...

Et c'est pareil quand j'utilise le type "double" à la place de "unsigned long" ...

En fait, il n'y a pas de doc très précise avec cette fonction!
J'ai trouvé que ça: http://rabbit.eng.miami.edu/info/functions/time.html#gtod

C'est un peu maigre... :hum:

godrik
godrik
Niveau 30
20 mai 2011 à 17:55:03

"$ man gettimeofday" est tres precis chez moi. le temps est separe en deux composantes : secondes et millisecondes. il faut faier la somme et la multiplication qui va bien en faisant attentino a ne pas faire de type overflow.

jvfdp
jvfdp
Niveau 7
20 mai 2011 à 17:58:13

Ah! Je crois que j'ai compris!!! :gni: En faisant des exemples...

C'est tout simplement que ça ne compte que les millisecondes en court.
Mais le compteur de la fonction se remet à zéro à chaque seconde passée donc il faut ajouter le compteur des secondes + millisecondes! :rire2:

godrik
godrik
Niveau 30
20 mai 2011 à 18:02:48

yep. Cette fonction a ete pense a l'epoque des machines 16/32 bits. aujourd'hui on te mettrai un entier 64 bits et on reflechirait beaucoup moins. :)

jvfdp
jvfdp
Niveau 7
20 mai 2011 à 18:25:16

'A Y EST... ' MARCHE!!! :content:

Cette fois c'est sûr:

  1. include <iostream>
  2. include <sys/time.h>

using namespace std;

int main()
{
timeval start, end;
int nbr;
unsigned long aaa,bbb;
gettimeofday(&start, NULL);
cin >> nbr;
cout << nbr << endl;
gettimeofday(&end, NULL);
aaa = (start.tv_sec)*1000000.0+(start.tv_usec);
bbb = (end.tv_sec)*1000000.0+(end.tv_usec);

cout << "Début :" << aaa << endl;
cout << "Fin :" << bbb << endl;
cout << "Total: " << bbb - aaa << endl;
}

Je change le "double" en "unsigned long" pour avoir le chiffre précis en "tics".
En fait c'est pas des millisecondes!
Il incrémente de 10000 toute les 1/100e de secondes!!!
Donc, 'faut multiplier les secondes par 1 million!!! :ouch:

Voilà... :cool:

godrik
godrik
Niveau 30
20 mai 2011 à 18:55:41

OOPS!! tv_usec est en microsecondes et tv_sec en secondes. Desole de l'erreur.

La precision du compteur (quel est l plus petit interval de temps mesurable) depend de la machine (type de processeur) et version du noyau linux.

PS: puisque tu es en entier, utilises "1000000" et pas "1000000.0"

jvfdp
jvfdp
Niveau 7
20 mai 2011 à 22:31:22

pour le ".0" oui je sais c'est que j'avais laissé mon code avec le type "double"... mais apparemment ça fonctionne quand même avec le compilateur! :ok:

sinon, comme je l'ai dis ce n'est pas en microsecondes mais bien en 1 million de fois à la seconde l'unité des "tics" avec cette fonction! :cool:

très précis quoi... :)

godrik
godrik
Niveau 30
20 mai 2011 à 22:57:11

"pour le ".0" oui je sais c'est que j'avais laissé mon code avec le type "double"... mais apparemment ça fonctionne quand même avec le compilateur! :ok: "

Oui ca marche, mais le calcul est alors execute en flottant et il faut faire la convertion int-> float puis float-> int. Ca perd en precision et ca prend plus de temps. c'est dommage quand meme :)

"ce n'est pas en microsecondes mais bien en 1 million de fois à la seconde"
une seconde c'est un million de microsecondes :) En vrai ton noyau sait mesure des choses plus petite encore, mais ca devient fatiguant a utiliser.

Sous forums
  • Aide à l'achat Mac
  • Internet
  • Macintosh
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Steam Deck
  • Hardware