Hallo Leute..
Mich interessiert, welche Methode effizienter (im Sinne der Geschwindigkeit) ist. Die Methode mit dem Direktzugriff:
Code
#define INDEX(x,y,z) (z*xdim*ydim + y*xdim + x)
unsigned int my_array = new unsigned int[xdim*ydim*zdim];
...
unsigned int cur_a=0;
for (int z=0; z<zdim; z++)
{
for (int y=0; y<ydim; y++)
{
for (int x=0; x<xdim; x++)
{
cur_a = my_array[INDEX(x,y,z)];
...
// Zugriff auf die 26 Nachbarn des Elementes an der Position x,y,z
if (my_array[INDEX(x-1,y-1,z-1)] < cur_a) // Nachbar: 01
{
...
}
...
if (my_array[INDEX(x+1,y+1,z+1)] < cur_a) // Nachbar: 26
{
...
}
...
}
}
}
Alles anzeigen
... oder die mit Pointerarithmetik:
Code
...
unsigned int my_array = new unsigned int[xdim*ydim*zdim];
unsigned int *cur_a=0;
// nur 9 Verweise auf die Nachbarn (die restlichen Nachbarn
// werden mittels Pointerarithmetik ermittelt)
unsinged int *a01=0;
unsinged int *a02=0;
unsinged int *a03=0;
...
unsinged int *a09=0;
for (int z=0; z<zdim; z++)
{
for (int y=0; y<ydim; y++)
{
cur_a = &my_array[INDEX(x,y,z)];
...
// Zugriff auf die 9 Nachbarn des Elementes an der Position x,y,z
a01 = &my_array[INDEX(x-1,y-1,z-1)];
...
a09 = &my_array[INDEX(x+1,y+1,z+1)];
for (int x=0; x<xdim; x++)
{
...
if (*(a01+x) < cur_a) // Nachbar: 01
{
...
}
if (*(a01+x+1) < cur_a) // Nachbar: 02
{
...
}
if (*(a01+x+2) < cur_a) // Nachbar: 03
{
...
}
...
if (*(a02+x) < cur_a) // Nachbar: 04
{
...
}
if (*(a02+x+1) < cur_a) // Nachbar: 05
{
...
}
if (*(a02+x+2) < cur_a) // Nachbar: 06
{
...
}
...
...
if (*(a09+x) < cur_a) // Nachbar: 24
{
...
}
if (*(a09+x+1) < cur_a) // Nachbar: 25
{
...
}
if (*(a09+x+2) < cur_a) // Nachbar: 26
{
...
}
}
}
}
Alles anzeigen
D.h. die konkrete Frage, die ich mir hier stelle ist, ob "if (*(a+x+1) < cur_a)" teurer ist als "if (my_array[z*xdim*ydim + y*xdim + x] < cur_a)"? Also auf der einen Seite [Zwei Additionen und ein Derefenzieren] und auf der anderen Seite [3 Multiplikationen und zwei Additionen]. Oder anders ausgedrueckt: dauert das Dereferenzieren eines Pointers laenger als wenn man 3 uint Werte multipliziert (wenn man die Ermittlung des Pointers a mal auszer Acht laeszt)?
Koennt ihr mir eine Empfehlung geben, ohne, dass ich's jetzt selber testen muss?
Danke im Voraus,
ciao..