Errori, bug, domande - pagina 2880

 
Igor Makanu:

no

se ci sono sezioni di codice ripetitive, si otterranno test di ottimizzazione!

Che differenza fa la durata di esecuzione di rand()?

Lasciate che venga eseguito a 2/3 del tempo del test, l'importante è rendere costante il tempo di rand()

Il vostro codice MQL userà le funzioni MQL del sistema, giusto? - che senso ha testare un codice perfetto?

)) la differenza di velocità potrebbe essere 4 volte a favore di uno dei metodi (da 1 a 4), ma poiché l'operazione rand è 10 volte più lenta del resto del codice, questa differenza non sarebbe visibile (da 11 a 14)

 
Alexandr Andreev:

)) La differenza di velocità avrebbe potuto essere di 4 volte a favore di uno dei metodi (da 1 a 4), ma poiché l'operazione rand 10 volte più lunga del resto del codice, questa differenza non sarebbe stata visibile (da 11 a 14)

no, non potrebbe

la differenza è immediatamente visibile

controlliamo qualcosa che gli sviluppatori hanno annunciato nelle innovazioni, spesso scrivono che il tempo di accesso al timestamp per qualche funzione è stato ottimizzato = non controllato per molto tempo

#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 : : : loops=10000000 ms=353174

2020.10.16 02:11:21.967 SpeedTst (EURUSD,H1) tst 2 : : : loops=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 : : : loops=10000000 ms=359757

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

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

 
Igor Makanu:

per niente critico

Il tempo di esecuzione di rand() è costante, molto probabilmente è una comune funzione C++, cercate su google "rand c++ source code"

dovete inizializzarlo, ma se lo inizializzate con delle costanti potreste incontrare un'ottimizzazione

in generale, non capisco l'antipatia di rand()

un'opzione è quella di inizializzare con qualcosa come questo:

sarebbe veloce.


ha eseguito il tuo script, imho non corretto.

Il tempo principale è il caricamento del codice nella cache e poi nel processore

e aggiungere la discrezione del timer del sistema

otteniamo... quasi un numero casuale.

è necessario testarlo a lungo, circa 100500 volte, imho

rand() silenzia il risultato.
Sul mio computer, un'iterazione del ciclo richiede circa 1,5 nanosecondi.

Con due rand(), un'iterazione richiede il doppio del tempo - fino a quasi 3 nanosecondi. Dovreste rendervi conto che in questa iterazione due accessi a un elemento di un grande array svaniranno, il che è anche piuttosto costoso.
Significa che circa 2/3 di tutto il tempo di iterazione è speso per due rands(). Certo, mi sono un po' eccitato su "di un ordine di grandezza" ))

Non capisco come si possa incorrere nell'ottimizzazione quando una matrice pre-preparata viene riempita di numeri casuali.

Si è già discusso una volta delle prestazioni di rand(). Ho anche provato a scrivere io stesso una funzione simile.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;
   });
}

risultato

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
 

Penso che la linea di fondo sia che non fa quasi nessuna differenza se usate l'unione o lo spostamento binario.
Io uso entrambi questi metodi nella mia libreria iCanvas per lavorare con il colore.

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


Ricordo che anch'io ho fatto dei test sulle prestazioni e ho concluso che non fa quasi nessuna differenza. Ma il codice con l'unione è più leggibile.
Devo ammettere che sono rimasto deluso perché mi aspettavo di ottenere un notevole guadagno di prestazioni con l'unione.

 
Nikolai Semko:

Non capisco come si possa incorrere nell'ottimizzazione quando una matrice pre-preparata viene riempita di numeri casuali.

Ti ho dato 2 link su hubr sopra, il primo articolo mostra bene come appare un ciclo normale dopo la compilazione

Non sto dicendo che dovete necessariamente arrivare all'ottimizzazione runtime, ma imho, se l'array non cambia, che è essenzialmente uno spazio di memoria costante con una dimensione costante per il ciclo, non è un fatto che l'ottimizzazione non salterà fuori su qualche tipo di processore, e l'ottimizzazione può essere prevista dal compilatore, così come dal processore con una cache


Nikolai Semko:

Penso che la linea di fondo sia che non fa quasi nessuna differenza cosa usare - unione o spostamento binario.

Sì, è vero, userò shift, il codice è leggibile, e non c'è bisogno di introdurre un nuovo tipo di dati - union
 
Igor Makanu:

Ti ho dato 2 link su hbr sopra, il primo articolo mostra bene come appare un ciclo normale dopo la compilazione

Non sto dicendo che dovete entrare nell'ottimizzazione runtime, ma imho, se l'array non cambia, che è essenzialmente uno spazio di memoria costante con una dimensione costante per il ciclo, non è certo che nessuna ottimizzazione salti fuori

A giudicare dai risultati, non c'è segno di ottimizzazione

 
Nikolai Semko:

I risultati non danno affatto l'impressione di ottimizzazione

L'argomento non riguarda un codice specifico

ma nella metodologia di test, mi attengo ancora a ciò che provo in modo ottimale, e rand() anche se introduce distorsioni, ma è un coefficiente lineare, non proporzionale, cioè la precisione non è molto importante se non c'è differenza di velocità inferiore al 5%, imho

 
Cari signori, qualcuno può almeno darmi una risposta a questa situazione che non capisco?
 

Ciao a tutti!

Ho una domanda, forse agli sviluppatori di MQL5? Forse qualcun altro lo sa... Ci sono piani per integrare il compilatore/editor di codice ME con alcuni ambienti di sviluppo popolari come IDEA o Visual Studio? Meta Editor è un grande dolore per me. Nessun collasso dei blocchi, nessun modello di autosostituzione (ad esempio, quando iniziate a digitare for(...) vi propone immediatamente di sostituire un modello di ciclo e molte altre cose), nessuna evidenziazione di varie parti importanti del codice. E così via. Non sto dicendo che i robot moderni sono complicati, si tratta di grandi progetti e ci sono richieste molto più serie alla gestione del codice e alle capacità di sviluppo del team.

Nessuno scrive più i propri editor e compilatori - tutti li abbandonano e passano a soluzioni già pronte di Microsoft, JetBrains e altri. Tutti gli editor moderni hanno sistemi di plugin personalizzabili che permettono di aggiungere tutto ciò che si vuole. Il compito non è difficile in linea di principio.

 
Сергей Таболин:
Cari signori, c'è qualcuno che può darmi una risposta a questa situazione che non capisco?

E dovresti maltrattare ancora di più i programmatori. Allora riceverai aiuto di sicuro.