#include "stdafx.h"
#include <time.h>
#define MULTI_ARRAY
#ifndef MULTI_ARRAY
#include "malloc.h"
#else
#include "boost/multi_array.hpp"
#endif
#include <cassert>
void fce() {
int ni = 3, nj = 4, nk = 2;
#ifdef MULTI_ARRAY
// Create a 3D array that is 3 x 4 x 2
typedef boost::multi_array<double, 3> array_type;
typedef array_type::index index;
array_type A(boost::extents[ni][nj][nk]);
index i, j, k;
#else
double ***A;
int i, j, k;
A = (double***) malloc(ni * sizeof (double**));
for (i = 0; i < ni; i++) {
A[i] = (double**) malloc(nj * sizeof (double*));
for (j = 0; j < nj; j++)
A[i][j] = (double*) malloc(nk * sizeof (double));
}
#endif
// Assign values to the elements
int values = 0;
for (i = 0; i != 3; ++i)
for (j = 0; j != 4; ++j)
for (k = 0; k != 2; ++k)
A[i][j][k] = values++;
// Verify values
int verify = 0;
for (i = 0; i != 3; ++i)
for (j = 0; j != 4; ++j)
for (k = 0; k != 2; ++k)
assert(A[i][j][k] == verify++);
#ifdef MULTI_ARRAY
#else
for (i = 0; i < ni; i++) {
for (j = 0; j < nj; j++)
free(A[i][j]);
free(A[i]);
}
free(A);
#endif
}
int _tmain(int argc, _TCHAR* argv[]) {
time_t t0 = time(NULL);
for (int i = 0; i < 500000; i++)fce();
time_t t1 = time(NULL);
printf("%d %d %d", (int) t0, (int) t1, (int) (t1 - t0));
return 0;
}
Testováno Microsoft Visual Studio C++:
multi_array 28s
*** 5s
Jestli někomu vyjde multi_array rychlejší než *** s výrazným časovým rozdílem, tak dejte vědět.
PS: Ještě pořád nevím, co je špatného na "double ***A;", prosím o vysvětlení.