Question pour les experts en #define - page 11

 
Igor Makanu:

si physiquement dans la commande CPU, non

un tableau est une zone de mémoire, l'accès aux éléments du tableau consiste à calculer l'indice d'un élément à partir du début de cette zone de mémoire et à extraire des données (octets) en fonction du type stocké.


si c'est la logique de l'algorithme, alors oui, ce sont des variables indexables.

en général sur le problème étudié, le seul conseil correct est https://www.mql5.com/ru/forum/354662/page4#comment_19039624 :

     {
      for(int i=0; i<ArraySize(mas); i++)
        {  
        r2+=ArraySize(mas);
        r2|=ArraySize(mas); 
        }

     }  
   ulong t2=GetMicrosecondCount();
   //for(ulong z=0; z<max; z++)
   int sizem=ArraySize(mas);
     {
      for(int i=0; i<sizem; i++)
        { 
        r2+=sizem;
        if (r2>10) r2|=sizem; 
        }
     } 

Le temps d'exécution d'une opération binaire est plusieurs fois plus rapide que le temps d'exécution d'une instruction if (il devrait l'être) ..... On dirait que dans les coulisses, le code natif est soit propre, soit super rapide.

Le temps de la partie supérieure est la moitié de celui de la partie inférieure.


Techniquement, nous comparons deux variables.)

 
Alexandr Andreev:

Le temps d'exécution d'une opération binaire est plusieurs fois plus rapide que le temps d'exécution d'une instruction if (il devrait en être ainsi) .....

Il ne devrait pas y avoir de if() dans les boucles, auparavant la boucle était exécutée par le registre CX.

Alexandr Andreev:

Le temps du supérieur est deux fois moins important que celui de l'inférieur.

Je ne discute pas, je testais à nouveau ce matin, l'optimisation du temps fonctionne toujours dans MQL5, le résultat dépend du nombre de boucles, et bien quel test a été appelé en premier - je ne le testerai plus, c'est une perte de temps.

 
Igor Makanu:

il ne devrait pas y avoir de if() dans les boucles, auparavant la boucle était exécutée par le cas CX

Je ne discute pas, je testais à nouveau ce matin, l'optimisation du temps fonctionne toujours dans MQL5, le résultat dépend du nombre de boucles, enfin, quel test a été appelé en premier, je ne le testerai pas à nouveau, c'est une perte de temps

.... Vous devez faire attention à vos posts)))) le post ci-dessus fait référence au post qui suggérait que l'opérateur ArraySize vérifie les dépassements (C'est votre si) et c'est en l'ajoutant au corps que vous vérifiez vraiment, et c'est la seule façon correcte.

Et la différence par rapport à l'exécution de la première est seulement dans vos tests)

 
Alexandr Andreev:

Et la seule différence par rapport à l'exécution de la première est dans vos tests)

Donnez-moi votre test, voyons voir.

bien que... Pas besoin, je participe à la discussion à la volée, vous aimez, j'ai une opinion différente sur l'opportunité d'utiliser ArraySize( ) dans la condition de fin de boucle.

 

.ex5 dimensions

void OnStart() // размер 12 272 байт
{
   int arr[];
   ArrayResize(arr, 100);
   ArrayInitialize(arr, 1);
   int sum = 0;
   for(int i = ArraySize(arr) - 1; i >= 0; i--)
   {
      sum += arr[i];
   }
   printf("sum = %i", sum);//sum = 100
}
//+------------------------------------------------------------------+
void OnStart() // размер 11 860 байт
{
   int arr[];
   ArrayResize(arr, 100);
   ArrayInitialize(arr, 1);
   int sum = 0;
   for(int i = 0; i < ArraySize(arr) - 1; i++)
   {
      sum += arr[i];
   }
   printf("sum = %i", sum);//sum = 100
}
//+------------------------------------------------------------------+
void OnStart() // размер  12 174 байт
{
   int arr[];
   ArrayResize(arr, 100);
   ArrayInitialize(arr, 1);
   int sum = 0;
   for(int i = 0, sz = ArraySize(arr); i < sz; i++)
   {
      sum += arr[i];
   }
   printf("sum = %i", sum);//sum = 100
}
 
Qui le sait, à part les fabricants de compilateurs ? Peut-être que ArraySize() fonctionne comme une référence de variable. Cela semble possible.
 
Dmitry Fedoseev:
Et qui sait, à part les créateurs du compilateur ? Peut-être que ArraySize() fonctionne comme l'adressage d'une variable. Cela semble possible.
void OnStart()
  {
   int mas[];  
   int size=1000000000;
   ArrayResize(mas,size); 
   int r2=0; 
   int tr=0;  
    int num_steps=ArraySize(mas); 
    double step = 1.0/(double)num_steps;
    
     int v=size;
    ulong t1 = GetMicrosecondCount();
    
  // for(ulong z=0; z<max; z++)
  
   int sizem=Size(mas);
     {
      for(int i=0; i<sizem; i++)
        { 
        r2+=sizem;
        r2|=sizem; 
        }
     } 
   ulong t2=GetMicrosecondCount(); 
     {
      for(int i=0; i<Size(mas); i++)
        {  
        r2+=Size(mas);
        r2|=Size(mas); 
        } 
     }  
   ulong t3=GetMicrosecondCount();
   
  Print(t2-t1," ",t3-t2," ",r2) ; 
  }
 
int Size(int &mas[]){return Size2(mas);} 
int Size2(int &mas[]){return Size3(mas);} 
int Size3(int &mas[]){return ArraySize(mas);} 

S'il vous plaît noter qu'ici le test entre la fonction qui appelle la fonction qui appelle ArraySize et la vitesse est la même, ce que d'accéder juste une variable. Parce que le compilateur les déploie simplement

ArraySize

d'utiliser ArraySize( ) dans la condition de fin de boucle.


et il n'y a aucune différence entre réarranger
Документация по MQL5: Основы языка / Функции / Вызов функции
Документация по MQL5: Основы языка / Функции / Вызов функции
  • www.mql5.com
Если некоторое имя, которое не было описано ранее, появляется в выражении и за ним следует левая круглая скобка, то оно по контексту считается именем некоторой функции. Аргументы (формальные параметры) передаются по значению, т. е. каждое выражение x1, . . . , xn вычисляется и значение передается функции. Порядок вычисления выражений и порядок...
 

un autre test de la_bald....

Pourquoi tester votre création une fois ?

Testez-le au moins dix fois pour voir ce qui se passe.

enveloppé dans un code de boucle externe, résultat :

HQ 0 15:26:55.230 tst (EURUSD,H1) 558620 543908 -512

RO 0 15:28:08.672 tst (EURUSD,H1) 544176 543129 -512

EF 0 15:28:09.759 tst (EURUSD,H1) 544139 543144 -512

RM 0 15:28:10.847 tst (EURUSD,H1) 544174 543436 -512

GD 0 15:28:11.934 tst (EURUSD,H1) 543668 543531 -512

CR 0 15:28:13.021 tst (EURUSD,H1) 543413 543097 -512

JI 0 15:28:14.107 tst (EURUSD,H1) 543046 543218 -512

HP 0 15:28:15.194 tst (EURUSD,H1) 543337 543469 -512

PO 0 15:28:16.282 tst (EURUSD,H1) 543602 544455 -512

KE 0 15:28:17.369 tst (EURUSD,H1) 543253 543197 -512

CL 0 15:28:18.457 tst (EURUSD,H1) 544199 543664 -512

Je ne réorganiserai pas les boucles testées, je me suis ennuyé avec la taille du code ci-dessus, cela signifie une bonne optimisation, peut-être avec l'analyseur de code, l'année dernière j'ai été surpris, dans l'optimisation iCustom pour MQL4 - 4 appels de 4=x tampons d'indicateurs sont remplacés par un seul appel, il y avait un sujet quelque part, encore une fois sur l'efficacité.

en général, Metacquotes a fait un bon travail sur l'analyse des codes de type des utilisateurs, c'est-à-dire que le compilateur va corriger la plupart des choses des utilisateurs par lui-même... cool, imho !

 

Désolé, je peux me tromper. Je ne l'ai pas lu en entier. Seulement la première page. L'impression est habituelle. Quelqu'un pose une question spécifique. Et puis les inondateurs arrivent en piqué.

Désolé encore une fois, est-ce vraiment un forum de développeurs ? ? ????

 
Сергей Таболин:

Désolé, je peux me tromper. Je ne l'ai pas lu en entier. Seulement la première page. L'impression est habituelle. Quelqu'un pose une question spécifique. Et puis les inondateurs arrivent en piqué.

Désolé encore une fois, est-ce vraiment un forum de développeurs ? ? ????

Faux, d'autres questions ont été soulevées là aussi, différentes de celles de TC. Et comprendre les principes de la compilation aide parfois.