domanda per gli esperti di #define - pagina 11

 
Igor Makanu:

se fisicamente nel comando CPU, no

una matrice è un'area di memoria, l'accesso agli elementi della matrice consiste nel calcolare un indice di un elemento dall'inizio di quest'area di memoria e recuperare i dati (byte) secondo il tipo memorizzato


se questa è la logica dell'algoritmo, allora sì - queste sono variabili indicizzabili

in generale sul problema in studio, l'unico consiglio corretto è 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; 
        }
     } 

Il tempo di esecuzione di un'operazione binaria è molte volte più veloce del tempo di esecuzione di un'istruzione if (dovrebbe esserlo) .... Sembra che dietro le quinte il codice nativo sia pulito o super veloce

Il tempo di quello superiore è la metà di quello inferiore.


Beh, tecnicamente stavamo confrontando due variabili))

 
Alexandr Andreev:

Il tempo di esecuzione di un'operazione binaria è molte volte più veloce del tempo di esecuzione di un'istruzione if (dovrebbe essere così) ....

non ci dovrebbero essere if() nei cicli, prima il ciclo è stato eseguito dal registro CX

Alexandr Andreev:

Il tempo di quello superiore è la metà di quello inferiore

Non sto discutendo, stavo testando di nuovo al mattino, l'ottimizzazione del tempo funziona sempre in MQL5, il risultato dipende dal numero di loop, bene quale test è stato chiamato per primo - non lo testerò di nuovo, è una perdita di tempo

 
Igor Makanu:

non ci dovrebbero essere if() nei loop, in precedenza il loop veniva eseguito da CX case

Non sto discutendo, stavo testando di nuovo al mattino, l'ottimizzazione del tempo funziona sempre in MQL5, il risultato dipende dal numero di loop, beh, quale test è stato chiamato per primo, non lo testerò di nuovo, è una perdita di tempo

.... Devi guardare i tuoi post)))) il post sopra si riferisce al post che ha suggerito che l'operatore ArraySize controlla gli overrun (QUESTO è il tuo se) ed è aggiungendolo al corpo che controlli veramente, e questo è l'unico modo corretto.

E la differenza dall'esecuzione del primo è solo nei tuoi test)

 
Alexandr Andreev:

E l'unica differenza rispetto all'esecuzione del primo è nei tuoi test)

Dammi il tuo test, vediamo.

anche se... Non c'è bisogno, sto partecipando alla discussione sull'automatismo, ti piace, io sono di un'opinione diversa sull'uso di ArraySize() nella condizione di terminazione del ciclo

 

.ex5 dimensioni

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
}
 
Chi lo sa, a parte i compilatori? Forse ArraySize() funziona proprio come un riferimento di variabile. Sembra possibile.
 
Dmitry Fedoseev:
E chi lo sa se non i creatori del compilatore? Forse ArraySize() funziona proprio come indirizzare una variabile. Sembra possibile.
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);} 

Notate che qui il test tra la funzione che chiama la funzione che chiama ArraySize e la velocità è lo stesso, cosa per accedere solo a una variabile. Perché il compilatore li dispiega semplicemente

ArraySize

ArraySize() debba essere usato nella condizione di terminazione


e non c'è alcuna differenza dal riordinare
Документация по MQL5: Основы языка / Функции / Вызов функции
Документация по MQL5: Основы языка / Функции / Вызов функции
  • www.mql5.com
Если некоторое имя, которое не было описано ранее, появляется в выражении и за ним следует левая круглая скобка, то оно по контексту считается именем некоторой функции. Аргументы (формальные параметры) передаются по значению, т. е. каждое выражение x1, . . . , xn вычисляется и значение передается функции. Порядок вычисления выражений и порядок...
 

un altro test da the_bald....

Perché testate la vostra creazione una volta sola?

testarlo almeno dieci volte per vedere cosa succede

avvolto nel codice del ciclo esterno, risultato:

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

Non riorganizzerò i cicli testati, mi sono annoiato con la dimensione del codice di cui sopra, significa una buona ottimizzazione, forse con l'analizzatore di codice, l'anno scorso sono stato sorpreso, in iCustom ottimizzazione per MQL4 - 4 chiamate di 4 = x buffer di indicatori sono sostituiti con una chiamata, c'era un argomento da qualche parte, di nuovo sull'efficienza

in generale, Metacquote ha fatto un buon lavoro sull'analisi dei codici dei tipi da parte degli utenti, cioè il compilatore sistemerà da solo la maggior parte delle cose degli utenti... figo, imho!

 

Mi dispiace, potrei sbagliarmi. Non l'ho letto tutto. Solo la prima pagina. L'impressione è la solita. Qualcuno fa una domanda specifica. E poi gli allagatori arrivano in picchiata.

Scusate ancora, questo è davvero un forum di sviluppatori ?????

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

Mi dispiace, potrei sbagliarmi. Non l'ho letto tutto. Solo la prima pagina. L'impressione è la solita. Qualcuno fa una domanda specifica. E poi gli allagatori arrivano in picchiata.

Scusate ancora, questo è davvero un forum di sviluppatori ?????

Sbagliato, anche lì sono state sollevate altre questioni, diverse da quelle di TC. E capire i principi della compilazione a volte aiuta.

Motivazione: