TheXpert: Un tableau dynamique a plus de contrôles, Renat a écrit une fois, je ne peux pas trouver le post, juste parler de l'accès à l'index, pourquoi il est significativement plus lent que les plus.
Il s'avère que lorsque l'on remplit des tableaux dynamiques, il est préférable de remplir d'abord des tableaux statiques, puis d'effectuer des ArrayCopy vers des tableaux dynamiques.
fxsaber: Quelle est la cause de ce ralentissement ?
Vous avez fait un tableau dynamique à partir d'un tableau statique. D'où tous les problèmes de type qui en résultent :
int a[][100];
ArrayResize(a, 100);
ZeroMemory(a);
// Первый цикл
for(int i; i < 100; ++i)
{
for(int n; n < 100; ++n)
{
a[i][n]++;
}
}
// Второй цикл
for(int n; n < 100; ++n)
{
for(int i; i < 100; ++i)
{
a[i][n]++;
}
}
Lorsque la première et la deuxième boucle tournent à des vitesses différentes.
Il s'avère que lorsque l'on remplit des tableaux dynamiques, il est préférable de remplir d'abord des tableaux statiques, puis d'effectuer des ArrayCopy vers des tableaux dynamiques.
C'est ainsi !
void FillArray1( int &Array[] )
{
constint Size = ArraySize(Array);
for (int i = 0; i < Size; i++)
Array[i] = i;
}
#define ARRAY_SIZE 10000void FillArray2( int &Array[] )
{
int ArrayStatic[ARRAY_SIZE];
constint Size = ArraySize(Array);
for (int i = 0; i < Size;)
{
constint Size2 = i + ARRAY_SIZE < Size ? ARRAY_SIZE : Size - i;
for (int j = 0; j < Size2; j++)
ArrayStatic[j] = i++;
if (Size2)
ArrayCopy(Array, ArrayStatic, i - Size2, 0, Size2);
}
}
#define BENCH(A) \
{ \
constulong _StartTime = GetMicrosecondCount(); \
A; \
Print("Time[" + #A + "] = " + (string)(GetMicrosecondCount() - _StartTime)); \
}
voidOnStart()
{
int Array1[];
ArrayResize(Array1, 1 e7);
int Array2[];
ArrayResize(Array2, 1 e7);
BENCH(FillArray1(Array1));
BENCH(FillArray2(Array2));
}
L'initialisation est généralement une opération ponctuelle et, la plupart du temps, vous n'avez pas à vous soucier de la vitesse. (plus frais de mémoire)
Mais s'il y a une référence constante par les index et que, par exemple, dans 99,9% des cas, la taille maximale du tableau est connue, il est probablement logique d'écrire un simple wrapper autour du tableau statique pour remplacer le tableau dynamique.
L'initialisation est généralement une opération ponctuelle et, la plupart du temps, vous n'avez pas à vous soucier de la vitesse. (plus les frais de mémoire).
J'ai un enregistrement qui ralentit lors de l'analyse des ticks. Il y en a des dizaines de millions, donc ça compte.
Mais s'il y a des références constantes par index et que, par exemple, dans 99,9% des cas, la taille maximale du tableau est connue, il est probablement plus judicieux d'écrire un simple wrapper autour d'un tableau statique plutôt qu'un tableau dynamique.
Il pourrait être judicieux de faire un enveloppement sur la lecture également.
SZZ En lecture, je ne peux pas obtenir d'accélération.
long ArraySum1( int &Array[] )
{
long Sum = 0;
constint Size = ArraySize(Array);
for (int i = 0; i < Size; i++)
Sum += Array[i];
return(Sum);
}
#define ARRAY_SIZE 100000long ArraySum2( int &Array[] )
{
long Sum = 0;
constint Size = ArraySize(Array);
int ArrayStatic[ARRAY_SIZE];
for (int i = 0; i < Size;)
{
constint Size2 = i + ARRAY_SIZE < Size ? ARRAY_SIZE : Size - i;
ArrayCopy(ArrayStatic, Array, 0, i, Size2);
for (int j = 0; j < Size2; j++)
Sum += ArrayStatic[j];
i += Size2;
}
return(Sum);
}
#define BENCH(A) \
{ \
constulong _StartTime = GetMicrosecondCount(); \
A; \
Print("Time[" + #A + "] = " + (string)(GetMicrosecondCount() - _StartTime)); \
}
voidOnStart()
{
int Array[];
ArrayResize(Array, 1 e8);
ArrayInitialize(Array, 1);
BENCH(Print(ArraySum1(Array)));
BENCH(Print(ArraySum2(Array)));
}
Si vous n'avez pas de compte, veuillez vous inscrire
Autorisez l'utilisation de cookies pour vous connecter au site Web MQL5.com.
Veuillez activer les paramètres nécessaires dans votre navigateur, sinon vous ne pourrez pas vous connecter.
Vous êtes connecté. L'authentification à deux facteurs a été désactivée. Configurez-la à nouveau et scannez un nouveau code QR, ou continuez avec l'authentification à deux facteurs désactivée.
Un tableau dynamique a plus de contrôles, Renat a écrit une fois, je ne peux pas trouver le post, juste parler de l'accès à l'index, pourquoi il est significativement plus lent que les plus.
Il s'avère que lorsque l'on remplit des tableaux dynamiques, il est préférable de remplir d'abord des tableaux statiques, puis d'effectuer des ArrayCopy vers des tableaux dynamiques.
Quelle est la cause de ce ralentissement ?
Vous avez fait un tableau dynamique à partir d'un tableau statique. D'où tous les problèmes de type qui en résultent :
Lorsque la première et la deuxième boucle tournent à des vitesses différentes.
Merci. C'est étrange, bien sûr. J'ai une différence stable.
Merci. C'est étrange, bien sûr. J'ai une différence stable.
Il s'avère que lorsque l'on remplit des tableaux dynamiques, il est préférable de remplir d'abord des tableaux statiques, puis d'effectuer des ArrayCopy vers des tableaux dynamiques.
C'est ainsi !
Il l'est !
L'initialisation est généralement une opération ponctuelle et, la plupart du temps, vous n'avez pas à vous soucier de la vitesse. (plus frais de mémoire)
Mais s'il y a une référence constante par les index et que, par exemple, dans 99,9% des cas, la taille maximale du tableau est connue, il est probablement logique d'écrire un simple wrapper autour du tableau statique pour remplacer le tableau dynamique.
L'initialisation est généralement une opération ponctuelle et, la plupart du temps, vous n'avez pas à vous soucier de la vitesse. (plus les frais de mémoire).
J'ai un enregistrement qui ralentit lors de l'analyse des ticks. Il y en a des dizaines de millions, donc ça compte.
Mais s'il y a des références constantes par index et que, par exemple, dans 99,9% des cas, la taille maximale du tableau est connue, il est probablement plus judicieux d'écrire un simple wrapper autour d'un tableau statique plutôt qu'un tableau dynamique.
Il pourrait être judicieux de faire un enveloppement sur la lecture également.
SZZ En lecture, je ne peux pas obtenir d'accélération.
Il l'est !
mon fillarray1 est légèrement plus rapide
et la lecture est un désordre.
mon fillarray1 est légèrement plus rapide
La version Release est en cours d'exécution. Optimisation activée.
La version Release est en cours d'exécution. L'optimisation est activée.
Temps [FillArray1(Array1)] = 17732
Temps [FillArray2(Array2)] = 18808
Je ne sais pas ce que signifie la libération - j'ai compilé sur F7 (ça doit être ça) ME 2085