Réccupérer un delta de temps (implutions) très court en C ?

piercemac

Membre confirmé
22 Juillet 2004
193
9
PACA
Bonjour,

Je cherche à obtenir le nombre d'impulsions d'horloge du processeur ou son temps d'exécution en millisecondes (même si celui-ci est approximatif).
J'ai essayé avec clock() qui paraît correspondre à ce que je cherche d'après la doc que j'ai pu trouver :
Code : C
Bloc de code:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
        clock_t d, f;
        d = clock();
        getchar();
        f = clock();
        printf("%d", f-d);

        return 0;
}
Mais ce code me retourne 0. :confused:
J'ai essayé d'autres solutions ou petites modifications sur ce code, qui n'ont pas marché. J'ai cherché sur le forum, ce qui n'a rien donné.

En fait, je cherche à récupérer un delta de temps court (des ticks d'horloges si possible ou sinon des millisecondes), qui prend repère pas plus tard qu'au début du programme (déclenché par une fonction donc) ou si ce n'est pas possible au démarrage du système, et non pas au 1er janvier 1970, comme le fait la fonction times(). Je cherche la fonction qui fait cela le plus simplement possible (sans d'autres options).

Si vous voyez un problème dans ce petit code ou si vous avez une solution, n'hésitez pas.

Merci:) .
 

piercemac

Membre confirmé
22 Juillet 2004
193
9
PACA

tatouille

Vétéran
1 Juin 2004
5 174
494
Stanford CA
tener à mettre quelque part

je suis tombé sur cette introduction au C qui est très bien Faite à mon sens
comme c'est une question while(1)

http://www.le.ac.uk/cc/tutorials/c/index.html

Bloc de code:
>$ cd /usr/include/   
>$ grep -R __darwin_clock_t .
Binary file ./c++/4.0.0/i686-apple-darwin8/bits/stdc++.h.gch/O0g.gch matches
Binary file ./c++/4.0.0/i686-apple-darwin8/bits/stdc++.h.gch/O2g.gch matches
Binary file ./c++/4.0.0/powerpc-apple-darwin8/bits/stdc++.h.gch/O0g.gch matches
Binary file ./c++/4.0.0/powerpc-apple-darwin8/bits/stdc++.h.gch/O2g.gch matches
Binary file ./c++/4.0.0/powerpc64-apple-darwin8/bits/stdc++.h.gch/O0g.gch matches
Binary file ./c++/4.0.0/powerpc64-apple-darwin8/bits/stdc++.h.gch/O2g.gch matches
Binary file ./c++/4.0.0/x86_64-apple-darwin8/bits/stdc++.h.gch/O0g.gch matches
Binary file ./c++/4.0.0/x86_64-apple-darwin8/bits/stdc++.h.gch/O2g.gch matches
Binary file ./gcc/darwin/3.5/c++/i686-apple-darwin8/bits/stdc++.h.gch/O0g.gch matches
Binary file ./gcc/darwin/3.5/c++/i686-apple-darwin8/bits/stdc++.h.gch/O2g.gch matches
Binary file ./gcc/darwin/3.5/c++/powerpc-apple-darwin8/bits/stdc++.h.gch/O0g.gch matches
Binary file ./gcc/darwin/3.5/c++/powerpc-apple-darwin8/bits/stdc++.h.gch/O2g.gch matches
./i386/_types.h:typedef unsigned long           __darwin_clock_t;       /* clock() */
./ppc/_types.h:typedef unsigned long            __darwin_clock_t;       /* clock() */
./sys/times.h:typedef   __darwin_clock_t        clock_t;
./sys/types.h:typedef   __darwin_clock_t        clock_t;
./time.h:typedef        __darwin_clock_t        clock_t;
c'est la def kern privé (plateforme specifique) d'un type c'est pareil sur n'importe quel OS
toi tu utilises clock_t puisque tu fais un program dans le userland/libc

c'est comme utiliser l'alias __asm__ reservé au kern level
ce sont des normes de dev toi au niveau userland tu utiliseras pour faire une verif assembler

asm (...

si cela t'interresse tu peux télécharger les sources de la libc
time et clock utilisent signal en fonction de ton horloge processeur

si cela t'interresse tu peux aussi voir la complexité pour la représentation
de la table des sinus sur un hardware donné ecetera


Bloc de code:
#include <stdio.h>
#include <time.h>

static void non_buffered_print(void *m)
{
	fprintf(stderr,"\n%lo\n\0",m);
}

int main(void)
{
	unsigned long diff;
	clock_t t1; /* microsecond */
	clock_t t2;
	int i = 0;
	
	t1 = clock();
	
	do{
		puts("Time 1 starts\0");
		sleep(1); 
	} while(++i <= 5);
	
	t2 = clock();
	
	i = 0;
	
	do{
		puts("Time 2 starts\0");
		sleep(1); 
	} while(++i <= 5);
	
	non_buffered_print(&t1);
	non_buffered_print(&t2);
	
	diff = t2 - t1;
	
	printf("\n%lo\n\0",diff);
	
	non_buffered_print(&diff);
	
	return 0;
}
+

Bloc de code:
#include <stdio.h>
#include <machine/limits.h>
#include <time.h>

static void _sleep(int s)
{
	clock_t t;
	t = clock () + s * CLK_TCK;
	
	while(clock() < t) {}
}

int main (void)
{
	int i = 10;
	
	do {
		printf("i = %d\n\0",i);
		_sleep(1);
	} while(--i >= 0);

	return 0;
}