domanda per gli esperti di #define - pagina 6

 
Igor Makanu:

Se si cambia la dimensione degli array nel corpo del ciclo, l'ottimizzazione al volo non funziona

quindi cambiate il codice:

)))) semplicemente dovete anche cambiare il valore della vostra variabile di dimensione, quindi il primo metodo nominato usando ArraySIze beneficerà

 
Alexandr Andreev:

Beh, non posso dire nulla contro IMHO.

Su replay molto grandi, le mie vittorie sono diventate casuali per il primo e il secondo metodo... Molto probabilmente è diventato dipendente dalla cache corrente della CPU e dal carico complessivo.

La mia domanda non riguardava il ciclo, ma come si svolgeva la funzione. È solo che ArraySize è stato usato come esempio.

Questo è un bene) La perfezione di un linguaggio di alto livello è proprio quando un'entrata conveniente è tanto economica quanto un'entrata non conveniente ma inizialmente economica. Peccato che non sia sempre così, e l'aiuto di un aiutante per i neofiti non sempre o..... non ci sarebbero domande)))

 
Igor Makanu:

Se si cambia la dimensione degli array nel corpo del ciclo, l'ottimizzazione al volo non funziona

Quindi cambiate il codice:


non funziona

l'ottimizzazione runtime è in testa

non si possono testare comandi mashin così semplici senza un profiler, o si può scrivere nel ciclo, o testare in un tester, la velocità è importante per questo.

Non stavo parlando del ciclo ma di come il compilatore svolge le funzioni..... andiamo.

Vi lascio a questo.

 
Alexandr Andreev:

)))) potete anche cambiare il valore della vostra variabile size, quindi il primo metodo che usa ArraySIze vincerà

Ho scritto sopra - un codice così semplice non può essere testato con semplici misure, ci sono molti fattori - il codice è piccolo - entrerà nella cache del processore, il codice deve essere ben suddiviso nel processore in micro-comandi paralleli nella pipeline del processore, cioè i registri saranno caricati rapidamente dal data prefetching

e forse anche rand() sarà memorizzato nella cache da qualche parte


Non so come testare senza debugger - almeno lì si può vedere il tempo di esecuzione delle istruzioni in tatto

 
Alexandr Andreev:

Allora dimostratemi che ho torto).

Perché nel mio test per qualche motivo sono uguali.

Ho cambiato il mio post.
Mi sembra che ArraySize ora sia più veloce della variabile cnt.
Prima era il contrario. Forse l'incremento cnt-- sta influenzando, il corpo del ciclo è diverso e probabilmente bisogna inventare qualcos'altro per il carico.

void OnStart()
{
   int arr[];
   int sz = ArrayResize(arr, 100000000);  
   
   ulong t = GetMicrosecondCount();
   
   for(int i=0; i < ArraySize(arr); i++) 
   {
      ArrayResize(arr, sz--); //какая то нагрузка
   }   
   
   t = GetMicrosecondCount() - t;
   
   PrintFormat("Total time: %.3f ms", t / 1000.0);
}
2020.11.02 21:33:22.863 TestScript (USDJPY,M1)  Total time: 451.200 ms


void OnStart()
{
   int arr[];
   int sz = ArrayResize(arr, 100000000);  
   int cnt = ArraySize(arr);
   
   ulong t = GetMicrosecondCount();
   
   for(int i=0; i < cnt; i++) 
   {
      ArrayResize(arr, sz--);
      cnt--;
   }
      
   t = GetMicrosecondCount() - t;
   
   PrintFormat("Total time: %.3f ms", t / 1000.0);
}
2020.11.02 21:56:26.591 TestScript (USDJPY,M1)  Total time: 531.872 ms
 
Roman:

Questo è strano.
L'utilizzo di ArraySize(arr) nella condizione di loop mostra meno tempo rispetto all'utilizzo della variabile cnt.
Prima era viceversa. Forse è un errore? Non dovrebbe essere così.

Non hai sbagliato nulla nel tuo codice, chi cambierà il valore per te?

cnt

cambiarlo per voi, come accade nella prima variante

 
void OnStart()
  {
   int mas[];
   int size=1000000;
   ArrayResize(mas,size);
   ulong r=0;
   ulong r1=0;
   ulong r2=0;
   int random;
   ulong max=100;
   uint t1=GetTickCount();
   int t=0;
   int tr=0; 
   MathSrand(10);
   for(ulong z=0; z<max; z++)
     {
      for(ulong i=0; i<ArraySize(mas); Funk(i))
        { 
         FunkRand(r1); 
         Funk(r);// мы сюда написали вызов еще одной функции чтобы усложить ситуацию
        }
     }
   tr=r;
   uint t2=GetTickCount();
   for(ulong z=0; z<max; z++)
     {
     int v=size;
      for(ulong i=0; i<v; i++)
        { 
         r2+=rand();
         r--;
        }

     }

   uint t3=GetTickCount();
   Print(t2-t1,"  ",t3-t2," ",r," ",r1," ",r2," ",t1," ",tr);
// Templ();
  }

//+------------------------------------------------------------------+
//|                                           
  
void Funk(ulong &a){a++;}
void FunkRand(ulong &a){a+=rand();}

//+------------------------------------------------------------------+

500p domanda (nessun controllo), quale modo è più veloce. vedere quante funzioni esterne sono chiamate nel metodo superiore

Документация по MQL5: Основы языка / Функции / Описание внешних функций
Документация по MQL5: Основы языка / Функции / Описание внешних функций
  • www.mql5.com
Внешние функции, определенные в другом модуле, должны быть явно описаны. Описание включает в себя тип возвращаемого значения, имя функции и набор входных параметров с их типами. Отсутствие такого описания может привести к ошибкам при компиляции, компоновке или выполнении программы. При описании внешнего объекта используйте ключевое слово С...
 

come variante del test - puoi anche infilare solo diversi array in ogni test - nel mio esempio arr1,arr2...

cioè tst1_arr1[],tst1_arr2[] .... e tst2_arr1[],tst2_arr2[]


questo sarebbe un test più giusto.

Sono fuori, molto distraente - imho, comodo, usalo

 
Igor Makanu:

Non so come testare senza debugger - almeno si può vedere il tempo di esecuzione delle istruzioni in cicli di clock.

Beh, sì - non si può fare a meno del debugger. E nel tempo dell'orologio lì...

 
Roman:

Questo è strano.
L'uso di ArraySize(arr) nella condizione di loop mostra meno tempo rispetto all'uso della variabile cnt.
Prima era viceversa. Forse è un errore? Non dovrebbe essere così.

Lì c'è un risultato casuale. Durante la compilazione, gli accessi a una cella di memoria con un valore di dimensione dell'array sono dispiegati, mentre la dimensione dell'array sarà ricevuta e messa nella cella di memoria prima, quando l'array è formato, anche se l'array è dinamico e le celle con una dimensione di array e il valore di una variabile avranno lo stesso tempo di accesso.

E a giudicare dalla frase che fanno i compilatori nel corso di informatica di 3-4 anni... in generale, spero che un livello di inquadramento sufficientemente necessario non mi renda molto nervoso in un ambiente MCL)