Erreurs, bugs, questions - page 2880

 
Alexandr Andreev:

)) La différence de vitesse aurait pu être de 4 fois en faveur d'une des méthodes (1 à 4), mais comme l'opération est 10 fois plus longue que le reste du code, cette différence n'aurait pas été visible (11 à 14).

Non, ça ne peut pas.

la différence est immédiatement visible

vérifions quelque chose que les développeurs ont annoncé dans les innovations, ils écrivent souvent que le temps d'accès à l'horodateur pour une certaine fonction a été optimisé = non vérifié depuis longtemps

#define    SpeedTest(count_x10,msg,EX)        {ulong mss=GetMicrosecondCount(); ulong count=(ulong)pow(10,count_x10);for(ulong _i=0;_i<count&&!_StopFlag;_i++){EX;} \
//+------------------------------------------------------------------+
void OnStart()
{
   double sum1 = 0.0;
   SpeedTest(7, "tst 1 : ",
   {
      sum1 += iOpen(NULL, 0, rand());
   });
//--
   double sum2 = 0.0;
   SpeedTest(7, "tst 2 : ",
   {
      double o[];
      CopyOpen(NULL, 0, rand(), 1, o);
      sum2 += o[0];
   });
   Print(sum1, " : ", sum2);
}
//+------------------------------------------------------------------+

2020.10.16 02:11:20.671 SpeedTst (EURUSD,H1) tst 1 : : boucles=10000000 ms=353174

2020.10.16 02:11:21.967 SpeedTst (EURUSD,H1) tst 2 : : boucles=10000000 ms=1296043

2020.10.16 02:11:21.967 SpeedTst (EURUSD,H1) 11304533.15558525 : 11303930.69247558

2020.10.16 02:11:44.012 SpeedTst (EURUSD,H1) tst 1 : : boucles=10000000 ms=359757

2020.10.16 02:11:45.369 SpeedTst (EURUSD,H1) tst 2 : : boucles=10000000 ms=1357325

2020.10.16 02:11:45.369 SpeedTst (EURUSD,H1) 11304350.05612442 : 11304321.21848488

 
Igor Makanu:

pas du tout critique

Le temps d'exécution de rand() est constant, il s'agit probablement d'une fonction C++ commune, recherchez dans Google "rand c++ source code".

vous devez l'initialiser, mais si vous l'initialisez avec des constantes, vous pouvez rencontrer des problèmes d'optimisation.

en général, je ne comprends pas l'aversion pour rand()

une option est d'initialiser avec quelque chose comme ceci :

serait rapide.


J'ai exécuté votre script, mais il n'est pas correct.

Le temps principal est le chargement du code dans le cache, puis dans le processeur.

et ajoutez le caractère discret du temporisateur du système

nous obtenons... presque un nombre aléatoire.

vous devez le tester pendant longtemps, environ 100500 fois, imho

rand() fait taire le résultat.
Sur mon ordinateur, une itération de boucle prend environ 1,5 nanoseconde.

Avec deux rand(), une itération prend deux fois plus de temps - jusqu'à près de 3 nanosecondes. Il faut savoir que dans cette itération, deux accès à un élément d'un grand tableau disparaîtront, ce qui est également assez coûteux.
Cela signifie qu'environ 2/3 de tout le temps d'itération est passé sur deux rands(). Bien sûr, j'ai été un peu excité par l'expression "d'un ordre de grandeur").

Je ne comprends pas comment on peut se heurter à l'optimisation lorsqu'un tableau préparé à l'avance est rempli de nombres aléatoires.

On a déjà parlé une fois des performances de rand(). J'ai même essayé d'écrire une fonction similaire moi-même.https://www.mql5.com/ru/forum/170952/page137#comment_12010041

#define  Num 10000000
#define  SpeedTest(msg,s,EX)  {ulong mss=GetMicrosecondCount(); EX \
                                    mss=GetMicrosecondCount()-mss;\
                                    printf("%-30s%llu µs; Сумма - %llu",msg,mss,s);}
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   ulong sum = 0;
   ushort in[];
   ArrayResize(in,Num*2);
   for (int i=0; i<Num*2; i++) in[i] = (ushort)rand();
   SpeedTest("test binary shift : ", sum,
   for (int i =0; i<(2*Num-1);i+=2)
   {
      sum+=in[i]<<(sizeof(ushort)*8) | in[i+1];
   });
//+------------------------------------------------------------------+ 
   sum = 0;
   union ushortTouint
   {
      uint param;
      ushort in[2];
   } u;
   SpeedTest("test union : ", sum,
   for (int i =0; i<(2*Num-1);i+=2)
   {
      u.in[0]=in[i+1];
      u.in[1]=in[i];
      sum+=u.param;
   });
//+------------------------------------------------------------------+   
   sum=0;
   SpeedTest("test binary shift + rand() : ", sum,
   for (int i =0; i<(2*Num-1);i+=2)
   {
      sum+=(ushort)rand()<<(sizeof(ushort)*8) | (ushort)rand();
   });
//+------------------------------------------------------------------+  
   sum = 0;
   SpeedTest("test union + rand() : ", sum,
   for (int i =0; i<(2*Num-1);i+=2)
   {
      u.in[0]=(ushort)rand();
      u.in[1]=(ushort)rand();
      sum+=u.param;
   });
}

résultat

2020.10.15 18:30:34.752 TestMakanu (USDCAD,M1)  test binary shift :           13474 µs; Сумма - 10736778112806491
2020.10.15 18:30:34.763 TestMakanu (USDCAD,M1)  test union :                  10189 µs; Сумма - 10736778112806491
2020.10.15 18:30:34.792 TestMakanu (USDCAD,M1)  test binary shift + rand() :  29103 µs; Сумма - 10741215942967312
2020.10.15 18:30:34.820 TestMakanu (USDCAD,M1)  test union + rand() :         28125 µs; Сумма - 10737655794873175
2020.10.15 18:30:37.802 TestMakanu (USDCAD,M1)  test binary shift :           11144 µs; Сумма - 10739125609966082
2020.10.15 18:30:37.812 TestMakanu (USDCAD,M1)  test union :                  10334 µs; Сумма - 10739125609966082
2020.10.15 18:30:37.840 TestMakanu (USDCAD,M1)  test binary shift + rand() :  27495 µs; Сумма - 10739749025492645
2020.10.15 18:30:37.867 TestMakanu (USDCAD,M1)  test union + rand() :         26782 µs; Сумма - 10738717766184542
2020.10.15 18:30:40.356 TestMakanu (USDCAD,M1)  test binary shift :           10618 µs; Сумма - 10738510882058397
2020.10.15 18:30:40.367 TestMakanu (USDCAD,M1)  test union :                  11354 µs; Сумма - 10738510882058397
2020.10.15 18:30:40.395 TestMakanu (USDCAD,M1)  test binary shift + rand() :  27637 µs; Сумма - 10738670876702722
2020.10.15 18:30:40.422 TestMakanu (USDCAD,M1)  test union + rand() :         26772 µs; Сумма - 10737441784096963
 

Je pense qu'en fin de compte, cela ne fait pratiquement aucune différence que vous utilisiez l'union ou le décalage binaire.
J'utilise ces deux méthodes dans ma bibliothèque iCanvas pour travailler avec les couleurs.

union argb {
   uint clr;
   uchar c[4];
};


Je m'en souviens, j'ai également effectué des tests de performance, et j'en ai conclu que cela ne faisait pratiquement aucune différence. Mais le code avec union est plus lisible.
Je dois avouer que j'ai été déçu car je m'attendais à un gain de performance notable avec l'union.

 
Nikolai Semko:

Je ne comprends pas comment on peut se heurter à l'optimisation lorsqu'un tableau préparé à l'avance est rempli de nombres aléatoires.

Je vous ai donné 2 liens sur le hubr ci-dessus, le premier article montre bien à quoi ressemble une boucle normale après compilation.

Je ne dis pas qu'il faut nécessairement arriver à l'optimisation à l'exécution, mais je pense que si le tableau ne change pas, ce qui est essentiellement un espace mémoire constant avec une taille constante pour la boucle, il n'est pas certain que l'optimisation n'apparaîtra pas sur un certain type de processeur, et l'optimisation peut être attendue du compilateur, ainsi que du processeur avec un cache.


Nikolai Semko:

Je pense que l'essentiel est que cela ne fait pratiquement aucune différence de savoir ce qu'il faut utiliser - union ou décalage binaire.

Oui, c'est ça, je vais utiliser shift, le code est lisible, et il n'y a pas besoin d'introduire un nouveau type de données - union
 
Igor Makanu:

Je vous ai donné 2 liens sur le hbr ci-dessus, le premier article montre bien à quoi ressemble une boucle normale après la compilation.

Je ne dis pas que vous devez vous lancer dans l'optimisation à l'exécution, mais je pense que si le tableau ne change pas, ce qui est essentiellement un espace mémoire constant avec une taille constante pour la boucle, il n'est pas certain qu'aucune optimisation ne surgira...

A en juger par les résultats, il n'y a aucun signe d'optimisation

 
Nikolai Semko:

Les résultats ne donnent pas du tout l'impression d'une optimisation.

oui

L'argument ne porte pas sur un code spécifique

mais dans la méthodologie des tests, je m'en tiens toujours à ce que je teste de manière optimale, et rand() bien qu'il introduise des distorsions, mais c'est un coefficient linéaire, pas proportionnel, c'est à dire que la précision n'est pas très importante s'il n'y a pas de différence de vitesse de moins de 5%, imho

 
Chers Messieurs, quelqu'un peut-il au moins me donner une réponse à cette situation que je ne comprends pas?
 

Bonjour, tout le monde !

J'ai une question, qui s'adresse peut-être aux développeurs de MQL5... Peut-être que quelqu'un d'autre sait... Est-il prévu d'intégrer le compilateur/éditeur de code ME à certains environnements de développement populaires comme IDEA ou Visual Studio? Meta Editor est un gros problème pour moi. Pas de réduction des blocs, pas de modèles de substitution automatique (par exemple, lorsque vous commencez à taper for(...), il vous propose immédiatement de substituer un motif de boucle et bien d'autres choses), pas de mise en évidence des différentes parties importantes du code. Et ainsi de suite. Je ne dis pas que les robots modernes sont compliqués, mais il s'agit de grands projets et les exigences en matière de gestion du code et de développement de l'équipe sont beaucoup plus importantes.

Plus personne n'écrit ses propres éditeurs et compilateurs - ils les abandonnent tous et se tournent vers les solutions toutes faites de Microsoft, JetBrains et autres. Tous les éditeurs modernes disposent de systèmes de plugins personnalisables qui vous permettent d'y ajouter ce que vous voulez. La tâche n'est pas difficile en principe.

 
Сергей Таболин:
Chers Messieurs, y a-t-il quelqu'un qui puisse me donner une réponse à cette situation que je ne comprends pas?

Et vous devriez intimider les programmeurs encore plus. Alors vous aurez de l'aide, c'est sûr.

 
TheXpert:

Et vous devriez intimider les programmeurs encore plus. Alors ils vont certainement aider.

Est-ce que j'ai dit à quelqu'un qu'il était stupide ? Ou accusé quelqu'un d'être analphabète ? Je traite tout le monde de la même manière. Si quelqu'un est offensé par mes appels à ne pas s'engager dans l'inondation, on ne peut rien y faire. C'est exactement ce pour quoi je ne m'excuserai pas.

Raison: