Obtenir le nombre de décimales de n'importe quel nombre (pas seulement les guillemets) en contournant Digits() dans MQL4 et MQL5 - page 15

 
Igor Makanu:

si ArrayCopy() est fait de la même manière que Cysh memmove(),

Je pense que la vitesse d'ArrayCopy() dépend de la vitesse d'allocation de la mémoire, si la mémoire tampon intermédiaire est prête à être copiée, ArrayCopy() sera exécuté très rapidement, si la mémoire n'est pas allouée, vous commencerez à demander au système d'exploitation d'allouer la mémoire

vous pouvez essayer de le tester - faire un appel à ArrayCopy() avec un grand volume de données, préparant ainsi la mémoire tampon pour le swapping, puis faire une boucle avec ArrayCopy() avec un plus petit volume de données à copier et ensuite mesurer la vitesse

Dans notre exemple actuel, la copie est exécutée dans un tableau statique, mais en général il est intéressant, bien sûr, quand ArrayCopy est plus lent qu'un simple for. Si vous devez allouer de la mémoire, vous devrez le faire de toute façon, quelle que soit la façon dont vous le faites.

 
Ilya Malev:

Dans notre exemple actuel, la copie est effectuée vers un tableau statique, mais en général, il est intéressant, bien sûr, lorsque ArrayCopy est plus lent que le simple for. Si nous devons allouer de la mémoire, nous devrons le faire de toute façon.

Cela n'a pas d'importance statique ou dynamique, nous ne savons pas comment ArrayCopy() est implémenté, j'ai juste supposé que c'est un "wrapper" sur les fonctions standard de Cish, memmove() fonctionne habituellement via un tampon supplémentaire... eh bien, comme d'habitude, c'est comme ça qu'il était écrit avant, il est difficile de dire comment et quel compilateur travaille

SZY : Je ne sais pas comment tester le temps d'exécution en MQL ((( - j'ai essayé plusieurs fois, je pense avoir pris des exemples dans l'aide, les résultats sont en quelque sorte très différents, et j'ai ignoré cette question par nécessité - je ne teste pas les performances, je regarde généralement dans le profileur, ce qui et comment est exécuté dans le temps

 
Igor Makanu:

Je ne sais pas comment tester la vitesse d'exécution en MQL ((( - J'ai essayé plusieurs fois, je pense que j'ai pris des exemples dans l'aide, mais les résultats étaient très différents pour une raison quelconque, donc j'ai abandonné sur cette question parce que je ne teste pas les performances, j'utilise habituellement le profileur pour voir comment et quoi est exécuté dans le temps

voici la méthode la plus simple, que j'ai utilisée ci-dessus

#property strict

#define    test(M,S,EX)        {uint mss=GetTickCount();int nn=(int)pow(10,M);for(int tst=0;tst<nn;tst++){EX;} \
                                printf("%s: loops=%i ms=%u",S,nn,GetTickCount()-mss);}

void OnStart()
 {
  int arr1[100]={0},arr2[100]={0};
  test(7,"Копирование через ArrayCopy",ArrayCopy(arr1,arr2))
  test(7,"Копирование через for",for(int i=0;i<100;i++)arr1[i]=arr2[i])
 }  


 
Ilya Malev:

voici la méthode la plus simple que j'ai utilisée ci-dessus


Merci, c'est fait, je le testerai demain.

 
Ilya Malev:

Oui, cela fonctionnera beaucoup plus rapidement (remplacé dans la mesure du possible par ArrayCopy, le reste est identique) :

Je vous l'ai dit, j'ai écrit la première chose qui m'est venue à l'esprit sans aucun test)).

Cette variante n'est pas différente de la mienne. Les mesures (temps minimum sur 10 essais) le prouvent.

https://www.mql5.com/ru/forum/287618/page14#comment_9807465
TicksToIntArray_fxsaber2
Time[TicksToIntArray(TicksIn,Array)] = 301036
IntArrayToTicks_fxsaber2
Time[IntArrayToTicks(Array,TicksOut)] = 315109
true

https://www.mql5.com/ru/forum/287618/page14#comment_9808274
TicksToIntArray_antfx1
Time[TicksToIntArray(TicksIn,Array)] = 216101
IntArrayToTicks_antfx1
Time[IntArrayToTicks(Array,TicksOut)] = 203610
true

https://www.mql5.com/ru/forum/287618/page14#comment_9810247
TicksToIntArray_antfx2
Time[TicksToIntArray(TicksIn,Array)] = 303656
IntArrayToTicks_antfx2
Time[IntArrayToTicks(Array,TicksOut)] = 312008
true

Vous pouvez voir que la variante avec cycle est plus rapide, car le cycle de 60 /4 = 15 éléments.

Dossiers :
 
fxsaber:

Cette variante n'est pas différente de la mienne.

Apparemment oui, seuls le type de structure et le type de tableau sont arbitraires.

 
fxsaber:

Vous pouvez voir que la variante en boucle est plus rapide, car la boucle de 60 /4 = 15 éléments.

Bizarrement, j'ai obtenu plus vite que ArrayCopy avec les mêmes MqlTicks et int...

 
Ilya Malev:

Bizarrement, j'ai obtenu plus vite que ArrayCopy avec les mêmes MqlTicks et int...

Je l'exécute dans MT5x64.

Ilya Malev:

Apparemment, oui, mais le type de structure et le type de tableau sont arbitraires.

J'ai volontairement évité le cas commun pour permettre à plus de personnes de participer.


Jusqu'à présent

https://www.mql5.com/ru/forum/287618/page14#comment_9808274
TicksToIntArray_antfx1
Time[TicksToIntArray(TicksIn,Array)] = 213426
IntArrayToTicks_antfx1
Time[IntArrayToTicks(Array,TicksOut)] = 202693
true

https://www.mql5.com/ru/forum/287618/page14#comment_9807465
TicksToIntArray_fxsaber3
Time[TicksToIntArray(TicksIn,Array)] = 192362
IntArrayToTicks_fxsaber3
Time[IntArrayToTicks(Array,TicksOut)] = 159932
true
 
fxsaber:

Fonctionne en MT5x64.

On a volontairement contourné le cas général pour que plus de personnes puissent participer.


Jusqu'à présent.

Je suppose que votre code est déjà plus rapide :)

Je dois y ajouter beaucoup de code de service pour améliorer la fonctionnalité d'ArrayCopy (début source, début dest, compte) et vérifier l'exactitude des paramètres...

En général, vous avez tellement de travaux/bibliothèques sympas que c'est étrange que vous demandiez et discutiez de la meilleure solution sur le forum :)

 
Ilya Malev:

C'est étrange que vous demandiez et discutiez de la meilleure solution sur le forum :)

J'en ai besoin pour la bibliothèque de HistoryTicks. Merci de votre participation.