Ho una domanda riguardante la velocità di dereferenziazione del puntatore. Ho una struttura in questo modo:Velocità di dereferenziamento puntatore di struttura C
typedef struct _TD_RECT TD_RECT;
struct _TD_RECT {
double left;
double top;
double right;
double bottom;
};
La mia domanda è, quale di questi sarebbe più veloce e perché?
CASO 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) ...
}
CASO 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) ...
}
Quindi, nel caso 1, il ciclo viene dereferenziazione direttamente il puntatore pRect avere la confronto valori. Nel caso 2, sono stati fatti nuovi valori sullo spazio locale della funzione (nello stack) ei valori sono stati copiati da pRect alle variabili locali. Attraverso un ciclo ci saranno molti confronti.
Nella mia mente, sarebbero ugualmente lento, perché la variabile locale è anche un punto di riferimento della memoria sullo stack, ma non sono sicuro ...
Inoltre, sarebbe meglio tenere riferimento p [] per indice, o incrementa p di un elemento e dereferenza direttamente senza un indice.
Qualche idea? Grazie :)
Smetti di sprecare il tuo tempo con l'ottimizzazione prematura che molto probabilmente non farà una piccola differenza. –
forse la frazione di uno smidge conta, ma se lo fa, perché non misurarlo? – kenny
Per Win32, potrei usare GetTickCount() per misurare il tempo prima e dopo aver chiamato il loop per misurare la velocità, o c'è un modo migliore? – oldSkool