bonjour,
dans mon bouquin (année : 1998) de C, il est dit que les vars register ont un accès plus rapide que les int...
j'ai constaté le contraire... c'est normal ?
bonjour,
dans mon bouquin (année : 1998) de C, il est dit que les vars register ont un accès plus rapide que les int...
j'ai constaté le contraire... c'est normal ?
Techniquement, un registre est tjrs plus rapide qu'un accès mémoire.
Mais register n'est qu'une recommandation faite au compilateur. Rien ne l'oblige à les suivre, ni, surtout, à mettre dans des registres des variables, ce qu'il sait faire de lui-même.
Il se peut que lorsque tu fais :
a soit placé dans un registre et b non
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 int a; register int b;![]()
et ya pas un moyen de savoir si une variable est définie en tant que register comme prévu ou si elle est définie en auto ?
faire un code du genre :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 si (a = type register) affiche "a = register" si (a = type auto) affiche "a = auto"
Non il n'a pas de moyen de connaître depuis le C ainsi. Par contre si ton compilateur accepte de générer un ASM au lieu de directement du binaire, tu pouras vérifier là, mais pas de manière automatique (et lire l'asm produit par un compilateur est très ardu). Enfin, register est une extension au langage C introduite par Borland.
Par contre je serais intéressé de savoir comment tu as pu mesurer la différence de performance entre la variable sans register et celle avec![]()
Le fichier .asm contient en général les numéros des lignes correspondant au code C... donc regarder si la variable est mise dans un registre, c'est pas si ardu que ça... si tu utilises GCC ou LCC en tous cas (j'ai pas essayé sous d'autres compilos)Envoyé par Anomaly
oué, ça tombe bien, j'utilise gcc sous win (dev-cpp) et linux.
j'ai mesuré les temps d'accès très simplement avec les différences d'heures et des boucles for :
et j'obtiens (si je me souviens bien), 4 secondes pour la boucle auto et 7 pour la boucle register.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 #include <stdio.h> #include <time.h> main() { long start, end; int a1, a2; register int r1, r2; system("clear"); printf("\n\nLe programme compare les durées d'éxécution\n" " d'une boucle de comptage"); time(&start); for(a1 = 1; a1<=100000;a1++) for(a2=1;a2<=100000;a2++) ; time(&end); printf("\nLa boucle auto demande %ld secondes.", end-start); time(&start); for(r1=1;r1<=100000;r1++) for(r2=1;r2<=100000;r2++) ; time(&end); printf("\nLa boucle register demande %ld secondes", end-start); }
j'ai compilé ce code sous linux
linux est un multitache préemptif. Ton test n'est donc pas significatif.
Il faudrait bloquer le scheduler (je ne sais pas si c'est possible).
(register n'est pas une invention borland mais K&R)
ok, je vais essayer sous zin...
pareil.
c'est sous dos qu'il faudrait l'essayer.
et avec un disable()/enable() pour pas te prendre une it
tu pourrais m'expliquer un peu plus stp ?
![]()
Ce que tu peux faire aussi c'est essayer de baire une batterie de tests. Genre 1000 tests et tu fais une moyenne. ce sera déjà plus significatif.
Et sinon pour shunter la préemption tu peux essayer de mettre le processus en haute priorité. Comme ça même si il est interrompu, c'est pas pour longtemps parce qu'il y aura que les processus systèmes qui lui passeront dessus.
register ne doit plus être utilisé. Il est d'ailleur ignoré par les compilos.
C'est fort possible ça. Parce que c'est une vieille instruction. Il y a 20 ans ça devait être très utile mais maintenant...
He bien si tu veux faire une boucle significative il ne faut pas qu'au milieu de ta boucle l'ordonnanceur (win ou linux) switche sur une autre thread ou process.
Dos étant monotache ça ne peut pas arriver, par contre une interruption matérielle (une irq) peut se déclancher (l'int 8 le timer par exemple)
disable() sert à interdire aux irq de se déclancher.
(et enable() remets les interruptions)
Salut
En effet j'ai pu lire que le mot clé register est désuet.
A bientot
C'est aund même dangereux de bloquer les interruptions.
Sous win/nux il suffit de mettre en priorite haute pour limiter le problème. Et sur une durée raisonable de test ca joue pas bcp.
bon ok, j'arrête d'utiliser les var register...
![]()
Partager