Question pour les experts en #define - page 8

 
void OnStart()
  {
   int mas[];
   int mas1[300];
   int mas2[300];
   int mas3[300];
   int mas4[300];
   int mas5[300];
   int mas6[300];
   int z=300;
   int size=100000000;
   ArrayResize(mas,size);
   ulong r=0;
   ulong r1=0;
   ulong r2=0;
   int random;
   ulong max=100; 
   int t=0;
   int tr=0; 
   MathSrand(10);
    int num_steps=ArraySize(mas);
    double x, pi, sum=0.0;
    double step = 1.0/(double)num_steps;
    
     int v=size;
    ulong t1 = GetMicrosecondCount();
     
    
  // for(ulong z=0; z<max; z++)
     {
      for(ulong i=0; i<ArraySize(mas); i++)
        { 
        r2+=ArraySize(mas);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2=r2/10;
        }

     }  
   ulong t2=GetMicrosecondCount();
   //for(ulong z=0; z<max; z++)
     {
      for(ulong i=0; i<v; i++)
        { 
        r1+=v;
        r1=r1/10;
        }
     }
   
   int pi2 = sum*step;
   ulong t3=GetMicrosecondCount();
   Print(t2-t1,"  ",t3-t2," ",r," ",r1," ",r2," ",pi," ",pi2);
// Templ();
  }

Malgré cela, le code le plus élevé gagne parfois, mais très rarement, c'est-à-dire que le lien est gratuit.

 
Alexandr Andreev:

) eh bien ce n'est pas comme ça que ça marche)


C'est ainsi que cela fonctionne en C++
Je pense que c'est la même chose en mql mais avec des enveloppes supplémentaires de MQ.


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

FAQ des débutants MQL5 MT5 MetaTrader 5

Roman, 2019.12.11 14:02

Tu n'as pas besoin d'y réfléchir, pourquoi devrais-je... Le compilateur le fera tout seul. ))
C# n'est pas C

Regardez la vidéo sur __inline.
Il y est expliqué comment les fonctions fonctionnent en mémoire pour ceux qui ne font pas de différence.


 
Roman:

Voici comment cela fonctionne en C++
En mql, je pense que c'est la même chose, mais avec des enveloppes supplémentaires provenant de MQ

Eh bien, maintenant relire ce fil et beaucoup de déclarations et d'exemples de test - qu'il ya une certaine différence. Et nous l'avons trouvé)))

 
Alexandr Andreev:

Eh bien maintenant relire ce fil et un tas de déclarations et d'exemples de tests - qu'il ya une différence. Et ils ont fait))))

Non ! Je n'ai aucune envie de le relire.
Il est évident pour moi qu'il y a une différence.

 
Roman:

Non ! Je n'ai aucune envie de le relire.
Il est évident pour moi qu'il y a une différence.

)))) un autre IMHO.

 
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
   int mas[];
   int mas1[300];
   int mas2[300];
   int mas3[300];
   int mas4[300];
   int mas5[300];
   int mas6[300];
   int z=300;
   int size=1000000000;
   ArrayResize(mas,size);
   ulong r=0;
   ulong r1=0;
   ulong r2=0;
   int random;
   ulong max=100; 
   int t=0;
   int tr=0; 
   MathSrand(10);
    int num_steps=ArraySize(mas);
    double x, pi, sum=0.0;
    double step = 1.0/(double)num_steps;
    
     int v=size;
    ulong t1 = GetMicrosecondCount();
     
    
  // for(ulong z=0; z<max; z++)
     {
      for(int i=0; i<ArraySize(mas); i++)
        { 
        r2+=ArraySize(mas);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1); 
        r2++;
        r2=r2/100;
        }

     }  
   ulong t2=GetMicrosecondCount();
   //for(ulong z=0; z<max; z++)
   int sizem=ArraySize(mas);
     {
      for(int i=0; i<sizem; i++)
        { 
        r1++;
        r1=r1/100;
        r1++;
        
        }
     }
    
   ulong t3=GetMicrosecondCount();
   Print(t2-t1,"  ",t3-t2," ",r2," ",r1);
// Templ();
  }

//+------------------------------------------------------------------+
//|                                           
  
void Funk(ulong &a){a++;}
void FunkRand(ulong &a){a+=rand();}

//+------------------------------------------------------------------+

La voie supérieure est plus rapide de presque 15%, c'est très significatif, enfin si tout est si évident expliquez-le moi)


 
Alexandr Andreev:

)))) un autre IMHO

La voie supérieure est plus rapide de presque 20%, bon puisque tout est si évident expliquez-le moi)


Les boucles comparées ne sont pas les mêmes en termes de code dans le corps.
La première boucle a un code dans le corps, le corps de la deuxième boucle a un autre code.
Des instructions de code naturellement différentes, un temps d'exécution naturellement différent.
Faites le même code dans le corps de la boucle et changez seulement la condition de boucle ArraySize et la variable size.
Nous testons cette partie, pas le corps.

 
Roman:

Les boucles comparées ne sont pas le même code dans le corps.
La première boucle a un code dans son corps et le corps de la deuxième boucle a un autre code.
Naturellement, les instructions de code et le temps d'exécution sont différents.
Faites le même code dans le corps de la boucle et changez seulement la condition de boucle ArraySize et la variable size.
Nous testons cette partie, pas le corps.

Votre test est plus incorrect car il dépend du cas de lancement, refaites-le. Dans les deux cas, il y a un incrément et une division. En plus, il y a quelques dizaines de milliards d'appels ArraySize supplémentaires.

D'ailleurs, c'est dans le corps que l'on doit écrire ce que l'on teste. Parce que c'est le corps qui est répété. Nous essayons de l'intégrer dans la boucle.... pour obtenir un résultat. c'est-à-dire qu'il était initialement nécessaire d'appeler ArraySize à partir du corps

Документация по MQL5: Операции с массивами / ArraySize
Документация по MQL5: Операции с массивами / ArraySize
  • www.mql5.com
"Нулевое измерение = Размер массива / (Первое измерение * Второе измерение * Третье измерение)"
 
Alexandr Andreev:

Votre test est plus incorrect car il dépend du cas de lancement, exécutez-le à nouveau. Ici, les deux cas ont un incrément et une division. En plus, il y a quelques dizaines de milliards d'appels à ArraySize.

D'ailleurs, c'est dans le corps que l'on doit écrire ce que l'on teste. Parce que c'est le corps qui est répété. Nous essayons de l'intégrer dans la boucle.... pour obtenir un résultat. c'est-à-dire qu'il était initialement nécessaire d'appeler ArraySize à partir du corps de l'appareil.

À chaque itération, la condition de la boucle contient déjà une vérification de la condition i<ArraySize() ou i<size
, c'est-à-dire qu'à chaque itération, soit une fonction, soit une variable est appelée.
Pourquoi devrions-nous mettre l'objet testé dans le corps ?

La logique même nous incite à décider lequel des deux sera le plus rapide à gérer. A une fonction ou à une variable.
Je me fiche de la façon dont le compilateur l'appelle. Je ne me fie pas au compilateur, j'utilise simplement mon bon sens pour déterminer ce qui est plus rapide à gérer du point de vue de la référence.

 
Roman:

À chaque itération, dans la condition de la boucle, la condition i<ArraySize() ou i<size
est de toute façon vérifiée, ce qui signifie qu'à chaque itération, on accède soit à une fonction, soit à une variable.
Pourquoi mettre l'objet à tester dans le corps ?

Parce que nous sommes les chanceux qui ont cette fonction et la fonction peut être n'importe quelle autre. Et il est placé exactement dans le corps. Je l'ai seulement dupliqué pour tenter d'améliorer son effet en s'adressant à différents réseaux.

Mais il est faux d'ajouter des tâches plus compliquées, dont l'erreur de calcul peut éclipser l'effet étudié. Au fait, il est également possible que l'assemblage ne soit pas constant dans μl, c'est-à-dire que lors de la recompilation peut obtenir des données légèrement différentes (bien que ce ne soit pas exact, mais c'est un peu utilisé comme protection contre le piratage) Donc tout peut être testé sur votre code pour vous. Voyez si les résultats changent.

Mcl essaie simplement de substituer le code comme indiqué dans la vidéo. C'est un peu différent là-bas. Mais en termes généraux.

Et ces instructions de fonctions qui ne savent pas quelle valeur elles vont obtenir - c'est comme ça que fonctionnent les js et les php et d'autres langages similaires, même µl fonctionne de cette façon mais seulement en mode débogage.

Документация по MQL5: Константы, перечисления и структуры / Состояние окружения / Информация о запущенной MQL5-программе
Документация по MQL5: Константы, перечисления и структуры / Состояние окружения / Информация о запущенной MQL5-программе
  • www.mql5.com
Информация о запущенной MQL5-программе - Состояние окружения - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Roman:

À chaque itération, dans la condition de la boucle, la condition i<ArraySize() ou i<size
est de toute façon vérifiée, ce qui signifie qu'à chaque itération, on accède soit à une fonction, soit à une variable.
Pourquoi devrions-nous mettre l'objet testé dans le corps ?

La logique même nous incite à décider lequel des deux sera le plus rapide à gérer. A une fonction ou à une variable.
Je me fiche de la façon dont le compilateur l'appelle. Je ne me fie pas au compilateur, je me fie au bon sens et je détermine ce qui est plus rapide à gérer du point de vue de la référence.

Ça ne marche pas toujours.

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

Question pour les experts en #define

Roman, 2020.11.02 19:44

J'ai changé mon message.
C'est l'inverse, c'est-à-dire que ArraySize est maintenant plus rapide que cnt.
C'était l'inverse avant. Peut-être que l'incrément cnt-- affecte, le corps de la boucle est différent et probablement quelque chose d'autre doit être inventé pour la charge.

void OnStart()
{
   int arr[];
   int sz = ArrayResize(arr, 100000000);  
   
   ulong t = GetMicrosecondCount();
   
   for(int i=0; i < ArraySize(arr); i++) 
   {
      ArrayResize(arr, sz--); //какая то нагрузка
   }   
   
   t = GetMicrosecondCount() - t;
   
   PrintFormat("Total time: %.3f ms", t / 1000.0);
}
2020.11.02 21:33:22.863 TestScript (USDJPY,M1)  Total time: 451.200 ms


void OnStart()
{
   int arr[];
   int sz = ArrayResize(arr, 100000000);  
   int cnt = ArraySize(arr);
   
   ulong t = GetMicrosecondCount();
   
   for(int i=0; i < cnt; i++) 
   {
      ArrayResize(arr, sz--);
      cnt--;
   }
      
   t = GetMicrosecondCount() - t;
   
   PrintFormat("Total time: %.3f ms", t / 1000.0);
}
2020.11.02 21:56:26.591 TestScript (USDJPY,M1)  Total time: 531.872 ms