Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

clock() temps écoulé et printf

12 réponses
Avatar
pere.noel
si je mesure le temps écoulé par :

clock_t start, stop;

[...]
start = clock();
[...]
printf(...);

stop = clock();
elapsed = ((double)stop - start) / CLOCKS_PER_SEC;
printf("Temps écoulé : %f\n", elapsed);

j'obtiens :
Temps écoulé : 0.030000

donc 30 ms.

MAIS ce n'est pas du tout ce que je perçois au terminal, au terminal
j'ai "l'impression" que ça dure 2 ou 3 seconde.

donc, est-ce un problème d'unités ?
ou est-ce que sur unix (Mac OS W 10.4.7) le printf et spoolé si bien que
le temps mis à sortir les données au term n'a pas grand chose à voir
avec le temps réel d'éxécution (c'est ce que je pense) ?

question annexe :

j'utilise la constante "CLOCKS_PER_SEC" y en a t'il une autre qui donne
le nombre de "CLOCKS" par ms ou dois-je faire la conversion moi-même (ce
que je pense) ?

j'ai regardé time.h il n'y a QUE :
#define CLOCKS_PER_SEC (__DARWIN_CLK_TCK)

--
une bévue

10 réponses

1 2
Avatar
Pierre Maurette
si je mesure le temps écoulé par :

clock_t start, stop;

[...]
start = clock();
[...]
printf(...);

stop = clock();
elapsed = ((double)stop - start) / CLOCKS_PER_SEC;
printf("Temps écoulé : %fn", elapsed);

j'obtiens :
Temps écoulé : 0.030000

donc 30 ms.

MAIS ce n'est pas du tout ce que je perçois au terminal, au terminal
j'ai "l'impression" que ça dure 2 ou 3 seconde.

donc, est-ce un problème d'unités ?
ou est-ce que sur unix (Mac OS W 10.4.7) le printf et spoolé si bien que
le temps mis à sortir les données au term n'a pas grand chose à voir
avec le temps réel d'éxécution (c'est ce que je pense) ?


Vous faites:

.....
clock_t start, stop;
double elapsed;
start = clock();
system("PAUSE");/* A remplacer selon implémentation */
stop = clock();
elapsed = ((double)stop - start) / CLOCKS_PER_SEC;
printf("Temps écoulé : %fn", elapsed);
.....

et vous compter 10 secondes. J'utilise un chronomètre sur mon téléphone
portable. Et vous verrez bien. Chez moi, ça marche correctement
(affiche des secondes).

question annexe :

j'utilise la constante "CLOCKS_PER_SEC" y en a t'il une autre qui donne
le nombre de "CLOCKS" par ms ou dois-je faire la conversion moi-même (ce
que je pense) ?

j'ai regardé time.h il n'y a QUE :
#define CLOCKS_PER_SEC (__DARWIN_CLK_TCK)


La norme ne définit que CLOCKS_PER_SEC dans ce domaine. Mais quel
serait l'intérêt ? Donner "par seconde" est plus précis. Après, vous
pouvez faire:
#define CLOCKS_PER_MILLISEC (CLOCKS_PER_SEC / 1000)
ou
#define FDCLOCKS_PER_MILLISEC ((double)CLOCKS_PER_SEC / 1000)

Chez moi, CLOCKS_PER_SEC vaut 1000.

--
Pierre Maurette

Avatar
pere.noel
Pierre Maurette wrote:

Vous faites:

.....
clock_t start, stop;
double elapsed;
start = clock();
system("PAUSE");/* A remplacer selon implémentation */
stop = clock();
elapsed = ((double)stop - start) / CLOCKS_PER_SEC;
printf("Temps écoulé : %fn", elapsed);
.....

et vous compter 10 secondes. J'utilise un chronomètre sur mon téléphone
portable. Et vous verrez bien. Chez moi, ça marche correctement
(affiche des secondes).



Ah mais je ne dis pas que ça ne marche pas, ce qu'il y a c'est qu'entre
mon "start = clock();" et mon "stop = clock();" il y a un printf dans
une boucle qui sort 689 lignes et, il me semble, que tout se passe comme
si les 689 printf étaient mis dans un buffer qui se débrouille tout seul
et donc que le temps total d'éxécution n'est pas le temps "percu" au
terminal.
question annexe :

j'utilise la constante "CLOCKS_PER_SEC" y en a t'il une autre qui donne
le nombre de "CLOCKS" par ms ou dois-je faire la conversion moi-même (ce
que je pense) ?

j'ai regardé time.h il n'y a QUE :
#define CLOCKS_PER_SEC (__DARWIN_CLK_TCK)


La norme ne définit que CLOCKS_PER_SEC dans ce domaine.
ok, c'est bien ce que je sipputais...


--
une bévue


Avatar
pere.noel
Pierre Maurette wrote:

Vous faites:

.....
clock_t start, stop;
double elapsed;
start = clock();
system("PAUSE");/* A remplacer selon implémentation */
stop = clock();
elapsed = ((double)stop - start) / CLOCKS_PER_SEC;
printf("Temps écoulé : %fn", elapsed);
.....

et vous compter 10 secondes.


bon j'ai mis la ligne de pause à :
system("sleep 10");

et j'obtiens bien 10 s de pause

MAIS le résultat est :
Temps écoulé : 0.010000
donc avec un facteur 1000 dans le nez )))

ça ne peut-être qu'un pb au niveau de la ligne :
elapsed = ((double)stop - start) / CLOCKS_PER_SEC;

que je ne comprend pas très bien je dois dire car j'ai :
clock_t start, stop;
double elapsed;
ce que je ne comprends pas c'est le cast :

((double)stop - start)

est-ce qu'il caste la différence de stop - start ou seulement stop ?
j'ai piqué cette ligne sur developpez.

j'ai casté différemment :

elapsed = (double) (stop - start) / (double)CLOCKS_PER_SEC;

ça ne change rien au résultat...

par ailleurs j'ai :
CLOCKS_PER_SEC : 100.000000

mystère et boules de gomme ?
--
une bévue

Avatar
Stéphane Goujet

clock_t start, stop;
[...]
start = clock();
[...]
printf(...);
stop = clock();
elapsed = ((double)stop - start) / CLOCKS_PER_SEC;
printf("Temps écoulé : %fn", elapsed);


Si elapsed est un double, il faut l'afficher avec %lf.


j'obtiens :
Temps écoulé : 0.030000
donc 30 ms.
MAIS ce n'est pas du tout ce que je perçois au terminal, au terminal
j'ai "l'impression" que ça dure 2 ou 3 seconde.
donc, est-ce un problème d'unités ?
ou est-ce que sur unix (Mac OS W 10.4.7) le printf et spoolé si bien que
le temps mis à sortir les données au term n'a pas grand chose à voir
avec le temps réel d'éxécution (c'est ce que je pense) ?


Il faut voir aussi que clock() vous retourne le temps processeur
occupé par votre programme, pas le temps écoulé entre ses 2 appels. Pour
ce dernier usage, cf gettimeofday (ou time, peut-être).

A+,
Stéphane.

Avatar
pere.noel
Stéphane Goujet wrote:


Si elapsed est un double, il faut l'afficher avec %lf.


ah bon ?
là gcc ne dit rien du tout et mon petit tableau "C Reference Card
(ANSI)" dit f tout court, lf ne serait-pas pour long double ??? qui
n'existe peut-être pas d'ailleurs )))

mais j'ai mis %lf, gcc ne couine pas et ça donne la même chose au
term...


j'obtiens :
Temps écoulé : 0.030000
donc 30 ms.
MAIS ce n'est pas du tout ce que je perçois au terminal, au terminal
j'ai "l'impression" que ça dure 2 ou 3 seconde.
donc, est-ce un problème d'unités ?
ou est-ce que sur unix (Mac OS W 10.4.7) le printf et spoolé si bien que
le temps mis à sortir les données au term n'a pas grand chose à voir
avec le temps réel d'éxécution (c'est ce que je pense) ?


Il faut voir aussi que clock() vous retourne le temps processeur
occupé par votre programme, pas le temps écoulé entre ses 2 appels. Pour
ce dernier usage, cf gettimeofday (ou time, peut-être).


ah d'accord, et par exemple alors, quand je fais un printf c'est en
qqsorte du temps en *** dehors *** du prog ? ie un autre process
s'occupe de ça (je pense que oui sous *nix)...

j'essaire avec time, date ou equivalent.

merci, j'ai pigé qqc !
--
une bévue


Avatar
Stéphane Goujet

Stéphane Goujet wrote:
Si elapsed est un double, il faut l'afficher avec %lf.
ah bon ?

là gcc ne dit rien du tout et mon petit tableau "C Reference Card
(ANSI)" dit f tout court,


Heu, oui, tiens, je viens de jeter un oeil à une page de manuel de
printf et je suis tout confus maintenant. Il est probable que j'aie dit
une ânerie. Mais d'où l'ai-je sortie ?

A+,
Stéphane.


Avatar
Pierre Maurette
Pierre Maurette wrote:

Vous faites:

.....
clock_t start, stop;
double elapsed;
start = clock();
system("PAUSE");/* A remplacer selon implémentation */
stop = clock();
elapsed = ((double)stop - start) / CLOCKS_PER_SEC;
printf("Temps écoulé : %fn", elapsed);
.....

et vous compter 10 secondes.


bon j'ai mis la ligne de pause à :
system("sleep 10");

et j'obtiens bien 10 s de pause

MAIS le résultat est :
Temps écoulé : 0.010000
donc avec un facteur 1000 dans le nez )))

ça ne peut-être qu'un pb au niveau de la ligne :
elapsed = ((double)stop - start) / CLOCKS_PER_SEC;

que je ne comprend pas très bien je dois dire car j'ai :
clock_t start, stop;
double elapsed;
ce que je ne comprends pas c'est le cast :

((double)stop - start)

est-ce qu'il caste la différence de stop - start ou seulement stop ?
j'ai piqué cette ligne sur developpez.

j'ai casté différemment :

elapsed = (double) (stop - start) / (double)CLOCKS_PER_SEC;

ça ne change rien au résultat...

par ailleurs j'ai :
CLOCKS_PER_SEC : 100.000000

mystère et boules de gomme ?


Ça semble en effet étrange, mais je n'ai pas trop regardé. Pas de code
complet, et de toutes façons sur mes diverses implémentations, clock_t
est un type entier. Chez vous, un type flottant très certainement. La
norme ne demande qu'un type arithmétique.

La première chose à faire est de vous procurer la norme:
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf

Ensuite, vous pouvez regarder time.h pour en savoir plus sur clock_t et
CLOCKS_PER_SEC. S'il le faut, vous remontez à d'autres .h pour avoir la
réponse. Il ne s'agit que de curiosité, votre code doit fonctionner
sans cette connaissance.

Ensuite, vous essayez d'affiner pour savoir où ça merde. Sans même
avoir regardé dans les .h, vous pouvez ajouter après le calcul de
elapsed la ligne:
printf("%.0fn%.0fn%.0fn%.2fn%.2fn%.2fn",
(float)start,
(float)stop,
(float)(stop - start),
(float)CLOCKS_PER_SEC,
(float)(stop - start)/CLOCKS_PER_SEC,
elapsed);
(peu importe la pureté du code, c'est pour glaner de l'information).

--
Pierre Maurette


Avatar
Stéphane Goujet

Si elapsed est un double, il faut l'afficher avec %lf.
là gcc ne dit rien du tout et mon petit tableau "C Reference Card

(ANSI)" dit f tout court, lf ne serait-pas pour long double ??? qui
n'existe peut-être pas d'ailleurs )))
mais j'ai mis %lf, gcc ne couine pas et ça donne la même chose au
term...


Effectivement, un l devant un f est ignoré. Et pour un long double,
c'est %Lf.
Mais comment doit-on afficher un float ? Faut-il le convertir en double ?

A+,
Stéphane.


Avatar
Jean-Marc Bourguet
Stéphane Goujet writes:


Si elapsed est un double, il faut l'afficher avec %lf.
là gcc ne dit rien du tout et mon petit tableau "C Reference Card

(ANSI)" dit f tout court, lf ne serait-pas pour long double ??? qui
n'existe peut-être pas d'ailleurs )))
mais j'ai mis %lf, gcc ne couine pas et ça donne la même chose au
term...


Effectivement, un l devant un f est ignoré. Et pour un long double, c'est
%Lf.
Mais comment doit-on afficher un float ? Faut-il le convertir en double ?


printf est une fonction variadique. Donc ses arguments sont promus. Et
les float sont promus en double (tout comme les char et les shorts sont
promus en int).

A+

--
Jean-Marc
FAQ de fclc: http://www.isty-info.uvsq.fr/~rumeau/fclc
Site de usenet-fr: http://www.usenet-fr.news.eu.org



Avatar
pere.noel
Pierre Maurette wrote:

Ça semble en effet étrange, mais je n'ai pas trop regardé. Pas de code
complet, et de toutes façons sur mes diverses implémentations, clock_t
est un type entier. Chez vous, un type flottant très certainement. La
norme ne demande qu'un type arithmétique.

La première chose à faire est de vous procurer la norme:
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf


OK, merci pour la ref, je commence à regarder, le premier truc que je
lis :

2 The clock function determines the processor time used.
^^^^^^^^^^^^^^^^^^^^^^^

Ensuite, vous pouvez regarder time.h pour en savoir plus sur clock_t et
CLOCKS_PER_SEC. S'il le faut, vous remontez à d'autres .h pour avoir la
réponse. Il ne s'agit que de curiosité, votre code doit fonctionner
sans cette connaissance.

Ensuite, vous essayez d'affiner pour savoir où ça merde. Sans même
avoir regardé dans les .h, vous pouvez ajouter après le calcul de
elapsed la ligne:
printf("%.0fn%.0fn%.0fn%.2fn%.2fn%.2fn",
(float)start,
(float)stop,
(float)(stop - start),
(float)CLOCKS_PER_SEC,
(float)(stop - start)/CLOCKS_PER_SEC,
elapsed);
(peu importe la pureté du code, c'est pour glaner de l'information).


mon code qui ne fait fait que "sleep 10" donc à la montre c'est aprox
bien 10 s :

--- clock_test.c -------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main (void)
{
clock_t start, stop;
double elapsed;

start = clock();
system("sleep 10");

stop = clock();
elapsed = ((double)stop - start) / CLOCKS_PER_SEC;
printf("%.0fn%.0fn%.0fn%.2fn%.2fn%.2fn",
(float)start,
(float)stop,
(float)(stop - start),
(float)CLOCKS_PER_SEC,
(float)(stop - start)/CLOCKS_PER_SEC,
elapsed);

return EXIT_SUCCESS;
}
------------------------------------------------------------------------

le print-out :
~/work/C/my_libs/system_profile%> ./clock_test
6
6
0
100.00
0.00
0.00


je pense que le "CLOCKS_PER_SEC" = 100 est bon (Eric Levenez m'en a
touché deux mots sur un autre fil).

ils sont curieux ces floats à 6, exactement...

bon MAIS un sleep 10 n'occupe pas le proc pendant 10s, heureusement
d'ailleurs...

j'imagine que le process est suspendu et réveillé au bout de 10 s, 'où
un temps nul.

j'imagine AUSSI que c'est la même chose pour printf, le process file le
job à un process-fils, non ?
(j'ai obervé, en utilisant le terminal, que les print-out se mélangeait
qqfois les pinceaux je veux dire que si l'on fait un long print-out, les
print-out d'erreur peuvent s'y retrouver au milieu même si les erreurs
viennent d'un endroit qui n'a rien à voir avec le print-out)

ça me paraît logique.
--
une bévue

1 2