domanda per gli esperti di #define - pagina 4

 
Alexandr Andreev:

Il dispiegamento delle normali funzioni è una cosa ovvia

cioè per esempio per (int i=0; i<ArraiSize(max); i++)

qui ArraiSize(max); sarà espanso e otterrà qualcosa come l'indirizzo alla dimensione dell'array dato (se guardiamo l'array, ha la sua dimensione in una variabile, e qui abbiamo la sostituzione su questa variabile "indirizzo in memoria") cioè non ha senso cambiarla in una variabile, affatto

per (int i=0; i<ArraiSize(max); i++)

и

per (int i=0; i<size; i++ )

In questo caso ArraiSize(max) e size hanno gli stessi tempi per determinare la dimensione dell'array

dichiarazione errata

testato: l'ho provato 1000 volte, 3 array e 3 loop annidati in ogni array, 2 varianti: la 1a e la 2a

il risultato è stabile (testato 3 volte):

2020.11.02 21:17:25.952 SpeedTst (EURUSD,H1) ArraySize: loops = 1000 seconds=114.5013

2020.11.02 21:17:40.713 SpeedTst (EURUSD,H1) cnt: loops = 1000 seconds=99.7722

Non vedo il senso di discutere la metodologia di test - molto lungo e necessario
 
Roman:

In questo ciclo di esempio, non credo di essere d'accordo sui tempi.
Al contrario, si raccomanda di ottenere il risultato in una variabile di dimensione e di usarla nella condizione.
Poiché il ciclo ad ogni iterazione perArraiSize(max) si snoderà inutilmente, rallentando l'esecuzione del ciclo.

La funzione ArraiSize(max) espande e restituisce la cella con il record di lunghezza dell'array; viene restituitol'indirizzo della cella dove è memorizzata la lunghezza dell'array

e ciò che è qualsiasi variabile, in questo caso la dimensione - è l'indirizzodella cella dove è memorizzata la lunghezza dell'array

Così, otteniamo la stessa cosa in uscita e anche se cambiamo la dimensione dell'array nel processo del ciclo, l'indirizzo per cella non cambierà né nel primo né nel secondo caso.

Dato che il valore mas è sempre statico (non è un riferimento), semplicemente non ci può essere altra logica))

La stessa funzione ArraiSize(max), dice che una sezione di memoria nell'arraymax dovrebbe essere usata per la lunghezza dell'array; questo viene eseguito in fase di compilazione - distribuzione della funzione

 
Igor Makanu:

dichiarazione errata

testato: misurazione 1000 volte, 3 array e 3 cicli di forza bruta annidati su ogni array, 2 varianti: 1st e 2nd

il risultato è stabile (testato 3 volte):

2020.11.02 21:17:25.952 SpeedTst (EURUSD,H1) ArraySize: loops = 1000 seconds=114.5013

2020.11.02 21:17:40.713 SpeedTst (EURUSD,H1) cnt: loops = 1000 seconds=99.7722

Non vedo il senso di discutere la metodologia di test - molto lungo e necessario

poi alcuni problemi con il build....

 
Alexandr Andreev:

allora ci sono alcuni problemi con l'assemblaggio....

È chiaro che l'output è lo stesso.
Ma questa sezione di memoria sarà accessibile in modo diverso, questo era il punto.
L'accesso a una variabile è più veloce che a una funzione, poiché la variabile contiene già il valore.
E una funzione deve ancora recuperare questo valore e restituirlo, cioè fare riferimento a una cella di memoria, un'istruzione non necessaria.

L'esempio di Igor è solo una conferma di quello che stavo dicendo.

 
Alexandr Andreev:

poi alcuni problemi con il montaggio....

mentito

ArraySize() è chiamato ad ogni iterazione

anche se non si controlla la dimensione dell'array ogni volta, si ottiene comunque una chiamata alla procedura e almeno un controllo della variabile che memorizza la dimensione dell'array

questo è il test di cui sto scrivendo, ridimensioniamo l'array nel ciclo, il ciclo è interrotto come dovrebbe essere, cioè ad ogni iterazione del ciclo la dimensione dell'array è determinata dopo l'esecuzione del corpo del ciclo:

void OnStart()
{
   int arr[];
   int sz = ArrayResize(arr, 100000);
   int cnt = 0;
   for(int i = 0; i < ArraySize(arr); i++)
   {
      ArrayResize(arr, sz--);
      cnt++;
   }
   printf("cnt = %i", cnt);   //cnt = 50001
}
 
Igor Makanu:

mentito

ArraySize() è chiamato ad ogni iterazione

anche se la dimensione dell'array non viene controllata ogni volta, la procedura viene comunque chiamata e almeno la variabile che memorizza la dimensione dell'array viene controllata

Ecco il test di cui sto scrivendo: ridimensioniamo l'array nel ciclo, il ciclo viene terminato come previsto, cioè ad ogni iterazione del ciclo la dimensione dell'array viene definita dopo l'esecuzione del corpo del ciclo:

Dammi il codice completo del tuo test.

Romano:

È chiaro che otteniamo la stessa cosa nell'output.
Ma questo frammento di memoria sarà recuperato in modo diverso, ecco cosa intendo.

L'esempio di Igor è solo una conferma di quello che stavo dicendo.

E tu stesso hai condotto il test, sono a 110000000000000000000 qualcosa del genere non succede.

Più precisamente, non ce l'ho in nessun test, anche a ripetizioniLONG_MAX
 
Alexandr Andreev:

La funzione ArraiSize(max) è espansa, prende una cella con il record di lunghezza dell'array e lo restituisce, l'indirizzo della cella dove è registrata lalunghezza dell'array

e ciò che è qualsiasi variabile, in questo caso la dimensione - è l'indirizzodella cella dove è memorizzata la lunghezza dell'array

Così, otteniamo la stessa cosa in uscita e anche se cambiamo la dimensione dell'array nel processo del ciclo, l'indirizzo per cella non cambierà né nel primo né nel secondo caso.

Dato che il valore mas è sempre statico (non è un riferimento), semplicemente non ci può essere altra logica))

La stessa funzione ArraiSize(max) dice che dovremmo usare un'area di memoria nell'arraymax responsabile della lunghezza dell'array e questo viene eseguito in fase di compilazione - distribuzione della funzione

Questa opinione sembra essere prematura. Cosa succede esattamente dietro la funzione ArraiSize è sconosciuto, vero? È una scatola nera in MQL. È abbastanza possibile che for (int i=0; i<ArraiSize(max); i++) porti all'esecuzione di diverse istruzioni. Per esempio, una funzione può controllare i parametri di ingresso. Salvare - spingere i dati fuori dallo stack. Salva i registri. Ripristinare i registri. Chiamata di funzione - chiamata, poi ritorno. Quello che voglio dire è che molte cose possono accadere sullo sfondo e noi non possiamo vederle. Ecco perché è meglio usare for (int i=0; i<size; i++) e non fare affidamento sul compilatore per fare ciò che ci aspettiamo che faccia.

 
Alexandr Andreev:

Hai fatto tu stesso il test, io non ce l'ho a 110000000000000000000


È stato testato molto tempo fa, ecco perché uso solo le variabili nei cicli.

 
Roman:

Questo è stato testato molto tempo fa, quindi uso solo le variabili nei cicli.

Mostrami un test con il codice

 
Alexandr Andreev:

Mostrami il test del codice

Quale test? ))
Hai mostrato tu stesso entrambe le varianti della condizione del ciclo.
Anche Igor ha dato il codice qui sopra.
Basta misurare l'esecuzione del ciclo con la variabile size e con ArraySize() nella condizione del ciclo.

Motivazione: