Il s'agit peut-être d'une question répétitive. N'hésitez donc pas à la signaler si vous le souhaitez. En C++, j'ai appris que les dimensions des tableaux sont stockées consécutivement dans la mémoire. Comment les tableaux 3D sont-ils stockés en C ? J'ai donc fait une petite expérience pour assigner des nombres naturels à une matrice de taille 1600000000x1 et 1x1600000000 (veuillez changer le nom de la matrice). matsize
dans le code à une valeur plus petite en fonction de votre mémoire). Le code ci-dessous attribue un nombre naturel de 1 à 1600000000 à la matrice a
(dont les dimensions sont 1x1600000000) et calcule la somme des cubes de tous les éléments. Le cas contraire consiste simplement à inverser les dimensions de la matrice, ce que je fais en modifiant xdim
a matsize
y ydim
à 1, et recompiler le code et l'exécuter à nouveau. La matrice est [xdim][ydim]
#include <iostream>
#include <time.h>
using namespace std;
int main()
{
long int matsize, i, j, xdim, ydim;
long double ss;
double** a;
double time1, time2, time3;
clock_t starttime = clock();
matsize=1600000000;
xdim=1;
ydim=matsize;
ss=0.0;
a= new double *[xdim];
for(i=0;i<xdim;i++)
{
a[i]= new double[ydim];
}
time1= (double)( clock() - starttime ) / (double)CLOCKS_PER_SEC;
cout << "allocated. time taken for allocation was " << time1 <<" seconds. computation started" << endl;
for(i=0;i<xdim;i++)
{
for(j=0;j<ydim;j++)
{
a[i][j]=(i+1)*(j+1);
ss=ss+a[i][j]*a[i][j]*a[i][j];
}
}
cout << "last number is " << a[xdim-1][ydim-1] << " . sum is " << ss << endl;
time2= ((double)( clock() - starttime ) / (double)CLOCKS_PER_SEC) - time1;
cout << "computation done. time taken for computation was " << time2 << " seconds" << endl;
for(i=0;i<xdim;i++)
{
delete [] a[i];
}
delete [] a;
time3= ((double)( clock() - starttime ) / (double)CLOCKS_PER_SEC) - time2;
cout << "deallocated. time taken for deallocation was " << time3 << " seconds" << endl;
cout << "the total time taken is " << (double)( clock() - starttime ) / (double)CLOCKS_PER_SEC << endl;
cout << "or " << time1+time2+time3 << " seconds" << endl;
return 0;
}
Mes résultats pour les deux cas sont -
Cas 1 : xdim=1 et ydim=1600000000
alloué. le temps pris pour l'allocation était de 4.5e-05 secondes. le calcul a commencé le dernier nombre est 1.6e+09 . la somme est 1.6384e+36 Le calcul est terminé. Le temps de calcul a duré 14,7475 secondes. deallocated. le temps pris pour la deallocation était de 0.875754 secondes le temps total est de 15.6233 ou 15.6233 secondes
Cas 2 : xdim=1600000000 et ydim=1
alloué. le temps pris pour l'allocation était de 56.1583 secondes. le calcul a commencé le dernier chiffre est 1.6e+09 . la somme est 1.6384e+36 Le calcul est terminé. Le temps de calcul a été de 50,7347 secondes. deallocated. le temps de deallocation est de 270.038 secondes. le temps total est de 320.773 ou 376.931 secondes
La somme de sortie est la même dans les deux cas. Je peux comprendre que le temps pris pour l'allocation et la désallocation de la mémoire est différent dans les deux cas, mais pourquoi le temps de calcul est-il aussi différent si l'allocation de la mémoire est continue ? Quel est le problème dans ce code ?
Si cela a de l'importance, j'utilise g++ sur Mountain Lion et je compile en utilisant g++ -std=c++11, processeur i7 quad core, 16 Go de RAM.