J'ai une question concernant la vitesse de déréférencement du pointeur. J'ai une structure comme ça:Vitesse de déréférencement de pointeur de structure C
typedef struct _TD_RECT TD_RECT;
struct _TD_RECT {
double left;
double top;
double right;
double bottom;
};
Ma question est, laquelle d'entre elles serait plus rapide et pourquoi?
CAS 1:
TD_RECT *pRect;
...
for(i = 0; i < m; i++)
{
if(p[i].x < pRect->left) ...
if(p[i].x > pRect->right) ...
if(p[i].y < pRect->top) ...
if(p[i].y > pRect->bottom) ...
}
CAS 2:
TD_RECT *pRect;
double left = pRect->left;
double top = pRect->top;
double right = pRect->right;
double bottom = pRect->bottom;
...
for(i = 0; i < m; i++)
{
if(p[i].x < left) ...
if(p[i].x > right) ...
if(p[i].y < top) ...
if(p[i].y > bottom) ...
}
Ainsi, dans le cas 1, la boucle est déréférencement directement le pointeur PRect pour obtenir la comparaison valeurs. Dans le cas 2, de nouvelles valeurs ont été créées sur l'espace local de la fonction (sur la pile) et les valeurs ont été copiées de la variable pRect vers les variables locales. Grâce à une boucle, il y aura beaucoup de comparaisons.
Dans mon esprit, ils seraient tout aussi lent, car la variable locale est également une référence de mémoire sur la pile, mais je ne suis pas sûr ...
Aussi, serait-il préférable de garder le référencement p [] par index, ou incrémenter p d'un élément et le déréférencer directement sans index.
Des idées? Merci :)
Cessez de perdre votre temps avec une optimisation prématurée qui ne fera probablement pas une différence. –
peut-être la fraction d'un smidge importe, mais si c'est le cas, pourquoi ne pas le mesurer? – kenny
Pour Win32, pourrais-je utiliser GetTickCount() pour mesurer le temps avant et après l'appel de la boucle pour mesurer la vitesse, ou y a-t-il un meilleur moyen? – oldSkool