Verlet! Danke
Ich vermute fast, das bei Arrays der schwerer wiegende Anteil ist, dass diese hübsch am Stück im Speicher liegen und nacheinander sehr effizient abgefuttert werden können, auch wenn die Referenzierung am Ende vielleicht mehr Aufwand ist.
Das ist genauso auch bei Array of Record's der Fall.
Ein Rekord gibt ja nur an, wie viel Speicher benötigt wird und wie man an die einzelnen Elemente rankommt (Delphi-Record <> Delphi-Class)
Ich habs nun getestet und erstaunlicherweise ist deine Variante doch schneller..
Code:
#define ARR_SIZE 1024 * 1024 /* 1mb */
#define REPETITIONS 3000
double x[ARR_SIZE];
double y[ARR_SIZE];
double z[ARR_SIZE];
point xyz[ARR_SIZE];
int main(int argc, char **args) {
const double val = 123.456;
// cpu-warmup
for (int i = 0; i < REPETITIONS; i++) { }
// test #1
int t = get_tick_count_ms();
for (int i = 0; i < REPETITIONS; i++)
for (int j = 0; j < ARR_SIZE; j++)
x[j] = y[j] = z[j] = val;
t = get_tick_count_ms() - t;
printf("Test #1\t %dms\t x[], y[], z[]\n", t);
// test #2
t = get_tick_count_ms();
for (int i = 0; i < REPETITIONS; i++) {
double *x_ptr = &x[0];
double *y_ptr = &y[0];
double *z_ptr = &z[0];
for (int j = 0; j < ARR_SIZE; j++)
*x_ptr++ = *y_ptr++ = *z_ptr++ = val;
}
t = get_tick_count_ms() - t;
printf("Test #2\t %dms\t x_ptr, y_ptr, z_ptr\n", t);
// test #3
t = get_tick_count_ms();
for (int i = 0; i < REPETITIONS; i++) {
for (int j = 0; j < ARR_SIZE; j++)
xyz[j].x = xyz[j].y = xyz[j].z = val;
}
t = get_tick_count_ms() - t;
printf("Test #2\t %dms\t xyz[]\n", t);
// test #4
t = get_tick_count_ms();
for (int i = 0; i < REPETITIONS; i++) {
point *xyz_ptr = &xyz[0];
for (int j = 0; j < ARR_SIZE; j++)
xyz_ptr++->x = xyz_ptr->y = xyz_ptr->z = val;
}
t = get_tick_count_ms() - t;
printf("Test #2\t %dms\t xyz_ptr\n", t);
}
Code:
Test #1 12338ms x[], y[], z[]
Test #2 11623ms x_ptr, y_ptr, z_ptr
Test #2 17074ms xyz[]
Test #2 13396ms xyz_ptr