Questions sur la POO dans MQL5 - page 71

 
Igor Makanu:

si vous écrivez de telles classes :

d'après vos recherches, la classe B sera plus lente à exécuter si vous utilisez fréquemment des champs de structure dans les calculs ?

Donc, nous discutions du temps de traversée d'un tableau d'objets))).

Selon votre exemple, ce sera la même chose en plus, mais en mql il y a une nuance, il y a deux champs implicites qui passent en premier, donc, le champ de données sera approché par le décalage, c'est-à-dire des calculs supplémentaires lors du déréférencement.

 
Vladimir Simakov:

Donc, nous discutions du temps de traversée du tableau d'objets))))

Selon votre exemple, ce sera la même chose en plus, mais en mql il y a une nuance, il y a deux champs implicites, qui vont en premier, donc, le champ de données sera approché par le décalage, c'est-à-dire des calculs supplémentaires lors du déréférencement.

Merci, c'est utile !

 
Vladimir Simakov:

Donc, nous discutions du temps de traversée d'un tableau d'objets))))

Selon votre exemple, ce sera la même chose en plus, mais en mql il y a une nuance : il y a deux champs implicites qui passent en premier, donc le champ de données sera accédé à un décalage, c'est-à-dire que des calculs de déréférencement supplémentaires seront effectués.

Les deux classes sont similaires. L'accès se fait par décalage dans les deux cas, mais pas par rapport au début de la structure, mais par rapport au début de la classe. En d'autres termes, la structure elle-même est en apesanteur. Seules les classes créent une surcharge.
 
Vladimir Simakov:

Donc, pas de mysticisme - les lois de la physique en action.

Ça ne correspond pas aux "lois de la physique".

#include <fxsaber\Benchmark.mqh> // https://c.mql5.com/3/321/Benchmark.mqh

long f1( const int Size, const long Amount = 5 e9 )
{
  long Sum = 0;
  
  for (long i = 0; i < Amount; i++)
  {
    Sum += Size * i;
    
    Sum |= 1;
  }
    
  return(Sum);
}

long f2( const int Size, const long Amount = 5 e9 )
{
  long Sum = 0;
  
  for (long i = 0; i < Amount; i++)
  {
    Sum += Size * (Amount - i);
    
    Sum |= 1;
  }
    
  return(Sum);
}

void OnStart()
{
  Print(_B(f1(2), 1));
  Print(_B(f1(200), 1));
  
  Print(_B(f2(2), 1));
  Print(_B(f2(200), 1));
}


        Alert: Time[Test6.mq5 267: f1(2)] = 3252 ms.
        6553255921290448385
        Alert: Time[Test6.mq5 268: f1(200)] = 4602 ms.
        -8757194524499019775
        Alert: Time[Test6.mq5 270: f2(2)] = 3061 ms.
        6553255931290448385
        Alert: Time[Test6.mq5 271: f2(200)] = 3112 ms.
        -8757193524499019775


Il s'agit d'un résultat paradoxal. Les calculs plus complexes sont effectués 1,5 fois plus vite et ne dépendent pas de la taille.

 
Vladimir Simakov:

Donc, nous discutions du temps de traversée des tableaux d'objets))))

Selon votre exemple, ce sera la même chose en plus, mais il y a une subtilité dans mql : il y a deux champs implicites qui passent en premier, donc le champ de données sera accédé à un décalage, c'est-à-dire que des calculs de déréférencement supplémentaires seront effectués.

Merci à Vladimir pour l'étude de l'assembleur.
Et comme le suggère Alexey, les frais généraux sont créés par les classes.
Nous pouvons en conclure que si vous pouvez vous passer de classes, il est préférable d'écrire du code en style procédural.
En d'autres termes, si la tâche ne nécessite pas de rapidité, vous pouvez l'envelopper dans une classe, mais si vous avez affaire à des tics, par exemple, il vaut mieux l'utiliser directement sans enveloppe.
En principe, c'est la démarche que j'ai suivie, et souvent en trouvant un exemple de classe, je démonte ses méthodes en approche procédurale.

 
Roman:

Merci Vladimir pour l'étude de l'assemblage.
Et comme le suggère Alexey, les frais généraux créent des classes.
Nous pouvons en conclure que si nous pouvons nous passer de classes, il est préférable d'écrire le code en style procédural.
En d'autres termes, si la tâche n'exige pas de rapidité, vous pouvez l'envelopper dans une classe, mais si vous avez affaire à des ticks, par exemple, il vaut mieux écrire directement sans wrapper.
En principe, c'est l'approche que j'ai suivie et souvent, lorsque je trouve un exemple de classe, je démonte ses méthodes en utilisant l'approche procédurale.

Il y a un troll sur le forum...
Avant, je ne comprenais pas pourquoi certains utilisateurs demandaient la fonction "ignorer", ah comme elle a disparu maintenant...

 

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégie

Questions sur la POO dans MQL5

fxsaber, 2020.05.30 14:06

Je n'ai aucune idée de ce qu'il faut en faire. J'ai fait des structures simples.

        50000000
        50000000
        Alert: Time[Test6.mq5 280: Func(Array1)] = 312 ms.
        1333106752
        Alert: Time[Test6.mq5 281: Func(Array3)] = 1348 ms.
        1333106752
        : sizeof(STRUCT1) = 20
        : sizeof(STRUCT3) = 84

Je ne sais pas pourquoi l'accès au premier champ d'une structure simple dépend de sa taille.

Vous utilisez 50M éléments dans un tableau.
Pour les structures de taille 20 et 84 octets, cela représente respectivement 0,93 Go et 3,91 Go de données.
Et dans le cadre de votre calcul, vraisemblablement, toute cette mémoire passe par le cache du processeur.
Et une explication très logique de ces résultats serait que 0,93 Go de données seraient téléchargées de la mémoire vers le cache du CPU quatre fois plus vite que les 3,91 Go de données.

Qu'en est-il des résultats du test C++ ?
Parce que j'ai vu du code assembleur, mais pas de résultats de tests, ou est-ce que j'ai mal regardé ?
 
Sergey Dzyublik:

Il y a un troll sur le forum...
Avant, je ne comprenais pas pourquoi certains utilisateurs demandaient la fonction "ignorer", ah comme elle est absente maintenant...

Tu dois faire attention à toi, pas aux autres.
Pas vous et pas pour vous, telle était la réponse.
Ignorer en silence ;))

 
Sergey Dzyublik:
Vous utilisez 50M éléments dans un tableau.
Pour des structures de 20 et 84 octets, cela représente respectivement 0,93 Go et 3,91 Go de données.
Et dans le cadre de votre calcul, on peut supposer que toute cette mémoire passe par le cache du processeur.
Et une explication très logique de ces résultats serait que 0,93 Go de données seraient téléchargées de la mémoire vers le cache du CPU quatre fois plus vite que les 3,91 Go de données.

Qu'en est-il des résultats du test C++ ?
Parce que j'ai vu du code assembleur, mais pas de résultats de tests, ou est-ce que j'ai mal regardé ?
Cela fonctionne de la même manière. C'est seulement un peu plus rapide, mais le ratio est le même, donc c'est du matériel.
 
Roman:

Merci Vladimir pour l'étude de l'assemblage.
Et comme le suggère Alexey, les frais généraux créent des classes.
Nous pouvons en conclure que si nous pouvons nous passer de classes, il est préférable d'écrire le code en style procédural.
En d'autres termes, si la tâche ne nécessite pas de rapidité, vous pouvez l'envelopper dans une classe, mais si vous avez affaire à des tics, par exemple, il vaut mieux l'utiliser directement sans enveloppe.
En principe, c'est l'approche que j'adopte, et souvent en trouvant un exemple de classe, je démonte ses méthodes dans un style procédural.

Vous pouvez utiliser une structure au lieu d'une classe, elles sont très bien.