Ottenere il numero di posizioni decimali di qualsiasi numero (non solo le virgolette) bypassando Digits() in MQL4 e MQL5 - pagina 15

 
Igor Makanu:

se ArrayCopy() è fatto nello stesso modo di Cysh memmove(),

Penso che la velocità di ArrayCopy() dipenda dalla velocità di allocazione della memoria, se la memoria intermedia del buffer è pronta per la copia, ArrayCopy() sarà eseguita molto rapidamente, se la memoria non è allocata, si avvieranno richieste al sistema operativo per allocare la memoria

potete provare a testarlo: fate una chiamata ad ArrayCopy() con un grande volume di dati, preparando così la memoria buffer per lo swapping, e poi fate un ciclo con ArrayCopy() con un volume di dati più piccolo da copiare e poi misurate la velocità

Nel nostro esempio attuale, la copia viene eseguita in un array statico, ma in generale è interessante, ovviamente, quando ArrayCopy è più lento di un semplice for. Se avete bisogno di allocare memoria, dovrete farlo comunque, non importa come lo fate.

 
Ilya Malev:

Nel nostro esempio attuale, la copia viene eseguita su un array statico, ma in generale è interessante, ovviamente, quando ArrayCopy è più lento del semplice for. Se abbiamo bisogno di allocare memoria, dovremo farlo comunque.

Non importa se è statico o dinamico, non sappiamo come ArrayCopy() sia implementato, ho solo supposto che sia un "wrapper" sopra le funzioni standard Cish, memmove() di solito funziona tramite un buffer aggiuntivo... beh, come al solito, è come è stato scritto prima, è difficile dire come e quale compilatore lavora

SZY: non so proprio come testare il tempo di esecuzione in MQL ((( - ho provato un paio di volte, credo di aver preso esempi dalla guida, i risultati sono in qualche modo molto diversi, e ho ignorato questa domanda per necessità - non testo le prestazioni, di solito guardo nel profiler, cosa e come viene eseguito nel tempo

 
Igor Makanu:

Non so proprio come testare la velocità di esecuzione in MQL ((( - Ho provato un paio di volte, credo di aver preso esempi dall'aiuto, ma i risultati erano molto diversi per qualche motivo, e ho rinunciato a questo problema perché non faccio test sulle prestazioni, di solito uso il profiler per vedere come e cosa viene eseguito nel tempo

Ecco il modo più semplice, che ho usato sopra

#property strict

#define    test(M,S,EX)        {uint mss=GetTickCount();int nn=(int)pow(10,M);for(int tst=0;tst<nn;tst++){EX;} \
                                printf("%s: loops=%i ms=%u",S,nn,GetTickCount()-mss);}

void OnStart()
 {
  int arr1[100]={0},arr2[100]={0};
  test(7,"Копирование через ArrayCopy",ArrayCopy(arr1,arr2))
  test(7,"Копирование через for",for(int i=0;i<100;i++)arr1[i]=arr2[i])
 }  


 
Ilya Malev:

Ecco il modo più semplice che ho usato sopra


Grazie, ricevuto, lo testerò domani

 
Ilya Malev:

Sì, questo funzionerà molto più velocemente (sostituito dove possibile da ArrayCopy, il resto è lo stesso):

Te l'ho detto, ho scritto la prima cosa che mi è venuta in mente senza nessun test))

Questa variante non è diversa dalla mia. Le misure (tempo minimo su 10 tentativi) lo dimostrano.

https://www.mql5.com/ru/forum/287618/page14#comment_9807465
TicksToIntArray_fxsaber2
Time[TicksToIntArray(TicksIn,Array)] = 301036
IntArrayToTicks_fxsaber2
Time[IntArrayToTicks(Array,TicksOut)] = 315109
true

https://www.mql5.com/ru/forum/287618/page14#comment_9808274
TicksToIntArray_antfx1
Time[TicksToIntArray(TicksIn,Array)] = 216101
IntArrayToTicks_antfx1
Time[IntArrayToTicks(Array,TicksOut)] = 203610
true

https://www.mql5.com/ru/forum/287618/page14#comment_9810247
TicksToIntArray_antfx2
Time[TicksToIntArray(TicksIn,Array)] = 303656
IntArrayToTicks_antfx2
Time[IntArrayToTicks(Array,TicksOut)] = 312008
true

Si può vedere che la variante con ciclo è più veloce, perché ciclo di 60 /4 = 15 elementi.

File:
 
fxsaber:

Questa variante non è diversa dalla mia.

Apparentemente sì, solo il tipo di struttura e il tipo di array sono arbitrari.

 
fxsaber:

Potete vedere che la variante del ciclo è più veloce, perché il ciclo di 60 /4 = 15 elementi.

Stranamente, ho ottenuto più velocemente di ArrayCopy con lo stesso MqlTicks e int...

 
Ilya Malev:

Stranamente, ho ottenuto più velocemente di ArrayCopy con lo stesso MqlTicks e int...

Lo sto eseguendo in MT5x64.

Ilya Malev:

Apparentemente, sì, ma il tipo di struttura e il tipo di array sono arbitrari.

Ho volutamente evitato il caso comune per permettere a più persone di partecipare.


Finora

https://www.mql5.com/ru/forum/287618/page14#comment_9808274
TicksToIntArray_antfx1
Time[TicksToIntArray(TicksIn,Array)] = 213426
IntArrayToTicks_antfx1
Time[IntArrayToTicks(Array,TicksOut)] = 202693
true

https://www.mql5.com/ru/forum/287618/page14#comment_9807465
TicksToIntArray_fxsaber3
Time[TicksToIntArray(TicksIn,Array)] = 192362
IntArrayToTicks_fxsaber3
Time[IntArrayToTicks(Array,TicksOut)] = 159932
true
 
fxsaber:

In esecuzione in MT5x64.

Volutamente bypassato il caso generale in modo che più persone potessero partecipare.


Finora.

Immagino che il tuo codice sia già più veloce :)

Devo aggiungere un sacco di codice di servizio per migliorare la funzionalità di ArrayCopy (source start, dest start, count) e controllare i parametri per la correttezza...

In generale, hai così tante opere/librerie fighe che è strano che tu chieda e discuta la soluzione migliore sul forum :)

 
Ilya Malev:

È strano che tu chieda e discuta la soluzione migliore sul forum :)

Ne ho bisogno per la libreria HistoryTicks. Grazie per aver partecipato.