Caractéristiques du langage mql5, subtilités et techniques - page 118

 
Non, j'avais tort. FastLog2 fonctionne plus vite quand Optimize=1. C'est un miracle... Je dois le vérifier en C++.
 
Alexey Navoykov:

D'ailleurs, à propos de zéro, FastLog2 ne vérifie pas le zéro, ce qui lui donne une longueur d'avance. Mais c'est toujours 1,5 à 2 fois plus lent que log2 si on le teste correctement).

Et qu'est-ce qui est incorrect à ce sujet ?

Parce que même votre version du test produit :

2019.01.05 04:43:12.372 TestLog (EURUSD,H1)     Result log2:       sum=1400005128  time=297 ms
2019.01.05 04:43:12.635 TestLog (EURUSD,H1)     Result log2_:      sum=1400018381  time=262 ms
2019.01.05 04:43:12.809 TestLog (EURUSD,H1)     Result _FastLog2:  sum=1400004095  time=174 ms
 
Alexey Navoykov:

D'ailleurs, à propos de zéro, FastLog2 ne vérifie pas le zéro, ce qui lui donne une longueur d'avance. Mais c'est toujours 1,5 à 2 fois plus lent que log2, si le test est correct).

Bien sûr, nous devrions supprimer la vérification du zéro de log2 ou ajouter la même chose à FastLog2.

La question porte en fait sur la vitesse de la partie informatique. En log2, tout est calculé uniquement par des décalages et des additions. FastLog2 utilise les valeurs de la table après des conversions astucieuses impliquant une multiplication. Ce code est très ancien, il a été utilisé à l'époque des coprocesseurs mathématiques, la situation a peut-être changé depuis.

 
Je l'ai vérifié en C++. Oui, FastLog2 est effectivement le plus rapide. Un code intelligent, cependant.) La raison en est peut-être que les opérations par bit sont beaucoup plus rapides que les opérations de comparaison.
 
J'ai testé tous les codes dans MT4. Dans MT4, le compilateur n'effectue aucune optimisation (c'est-à-dire que la variante avec somme donne les mêmes résultats relatifs que ma variante originale sans somme), et dans MT4, log2 fonctionne plus rapidement que FastLog2. Et dans MT5, il existe déjà une optimisation sans sommation (c'est-à-dire que le code n'est apparemment pas exécuté complètement), et la variante FastLog2 est plus rapide que log2. Je ne sais pas quelles conclusions on peut en tirer, car il n'y a pas de détails sur le fonctionnement de l'optimiseur de code ici et là.
 
void f(){
  static int a[]; 
  Print("a[]=",ArraySize(a)); 
  ArrayResize(a, 100); 
  Print("a[]=",ArraySize(a));}


class A
 {
public: A(){ f(); }
 };
 
A _a;

void OnStart()
  {

  }


 
Ilya Malev:

C'est le comportement standard de MQL5 : les variables statiques viennent après les variables globales.

Vous pouvez être sérieusement perturbé à cause de cela.
 
fxsaber:

C'est le comportement standard de MQL5 : les variables statiques commencent après les variables globales.

Est-ce la raison pour laquelle chaque variable statique d'une classe/structure doit être déclarée après la structure elle-même ? Et même sans lui attribuer une quelconque valeur... Peut-être devrions-nous suggérer que le compilateur fasse tout cela automatiquement ?

 

Il s'agit essentiellement d'un bogue, d'une séquence incorrecte d'exécution du code du programme. Le compilateur ne devrait pas permettre cela en principe. Vous devriez crier plus souvent sur les développeurs à ce sujet.

En C++, le code est traité par le compilateur strictement de haut en bas, donc tout ce qui est au-dessus est déjà initialisé. Et vous ne pouvez pas accéder au code en dessous. C'est pourquoi tout est clair. Et puisque les développeurs ont introduit leurs propres règles ici, qu'ils fournissent l'ordre correct d'exécution du code.

 
Alexey Navoykov:

En C++, le code est traité par le compilateur strictement de haut en bas, donc tout ce qui est en haut est déjà initialisé. Et vous ne pouvez pas accéder à ce qui est en bas. C'est pourquoi tout est clair.

Il y a moins de flexibilité.