Errori, bug, domande - pagina 655

 
Urain:

Grazie per il link, ma solo una domanda successiva: questo codice può essere usato per testare le prestazioni della scheda grafica?

No. Prima devi aggiungere un paio di milioni di oggetti per pagina. E poi loop(10000){ ChartRedraw(); }

:)

 
MetaDriver:

No. Per prima cosa, dovrete aggiungere un paio di milioni di oggetti per pagina. E poi loop(10000){ ChartRedraw(); }

:)

Un paio di milioni sono troppi, ma 100k sono abbastanza buoni per un test.

#property script_show_inputs
input uint Count=1000;
input uint CountObj=100000;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
   long ChId=ChartID(); 
   for(int i=0;i<CountObj;i++)
     {
      ObjHLine(ChId,i,1.+(i/(double)CountObj));
     }
   uint st=GetTickCount();
   for(uint i=0; i<Count; i++)ChartRedraw();
   Alert("Count ChartRedraw()=",Count," time=",GetTickCount()-st," mk.c.");
   ObjectsDeleteAll(ChId,0,OBJ_HLINE);
  }
//+------------------------------------------------------------------+
void ObjHLine(ulong chart_id,string name,double price)
  {   
   ENUM_OBJECT  type=OBJ_HLINE; // тип объекта  
   int          nwin=0;                   // индекс окна   
//---
   if(ObjectFind(chart_id,name)<0)
      ObjectCreate(chart_id,name,type,nwin,0,0,0,0);
   ObjectSetInteger(chart_id,name,OBJPROP_COLOR,clrGreen);
   ObjectSetDouble(chart_id,name,OBJPROP_PRICE,price);
  }
//+------------------------------------------------------------------+

È possibile chiamarlo "test oggettivo di idoneità della scheda video per la MT5"?

O forse gli oggetti dovrebbero anche cambiare i loro valori?

 
Urain:

Un paio di milioni sono troppi, ma 100k sono abbastanza buoni per un test.

È adatto? È possibile chiamarlo "test oggettivo della scheda video per mt5"?

Cosa c'è scritto? :) ho

2012.02.27 19:04:09 CardTest(Urain) (EURUSD,H1) Count ChartRedraw()=1000 at time=26224 ms

 
MetaDriver:

Cosa c'è scritto? Il mio.

2012.02.27 19:04:09 CardTest(Urain) (EURUSD,H1) Count ChartRedraw()=1000 at time=26224 ms


Proviamo a ridisegnare parte degli oggetti, e a specificare la CPU e la scheda video. Se gli sviluppatori non lo rifiutano, allora possiamo creare un ramo e tutti posteranno i loro dati. Ecco il codice con il ridisegno di una parte degli oggetti.

#property script_show_inputs
input uint Count=1000;
input uint CountObj=100000;
input uint CountObjRedrawt=1000;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
   long ChId=ChartID();
   uint sto,eno,reso;

   for(int i=0;i<CountObj;i++)
     {
      ObjHLine(ChId,i,1.+(i/(double)CountObj));
     }
   sto=GetTickCount();
   for(int i=0;i<CountObjRedrawt;i++)
      ObjectSetDouble(ChId,rand()%CountObj,OBJPROP_PRICE,1.+((i+1)/(double)CountObj));
   eno=GetTickCount();
   reso=eno-sto;

    uint st=GetTickCount();
   for(uint i=0; i<Count; i++)
     {
      if(i%2==0)
        {
         for(int j=0;j<CountObjRedrawt;j++)
            ObjectSetDouble(ChId,rand()%CountObj,OBJPROP_PRICE,1.+((i+2)/(double)CountObj));
        }
      else
        {
         for(int j=0;j<CountObjRedrawt;j++)
            ObjectSetDouble(ChId,rand()%CountObj,OBJPROP_PRICE,1.+((i+1)/(double)CountObj));
        }
      ChartRedraw();
     }
   Alert("ChartRedraw() Count=",Count," CountObj=",CountObj," CountObjRedrawt=",CountObjRedrawt," time=",GetTickCount()-st-(reso*Count)," mk.c.");
   ObjectsDeleteAll(ChId,0,OBJ_HLINE);
  }
//+------------------------------------------------------------------+
void ObjHLine(ulong chart_id,string name,double price)
  {
   ENUM_OBJECT  type=OBJ_HLINE; // тип объекта  
   int          nwin=0;                   // индекс окна   
//---
   if(ObjectFind(chart_id,name)<0)
      ObjectCreate(chart_id,name,type,nwin,0,0,0,0);
   ObjectSetInteger(chart_id,name,OBJPROP_COLOR,clrGreen);
   ObjectSetDouble(chart_id,name,OBJPROP_PRICE,price);
  }
//+------------------------------------------------------------------+

qui è riscritto più stampe che era visibile a quali impostazioni.

Ops, i contatori interni devono essere cambiati in j.

 

Scrive:

Test VideoCart (EURUSD,M15)     ChartRedraw() Count=1000 CountObj=100000 CountObjRedrawt=1000 time=24859 mk.c.
Проц P4 3 Гц, RAM 3 Гб
Видяха NVIDIA Corporation GeForce GT 430 with OpenCL 1.1 (2 units, 1400 MHz, 1023 Mb, version 295.73)
 
Urain:

Proviamo a ridisegnare una parte degli oggetti e a specificare la CPU e la scheda video. Se gli sviluppatori non lo rifiutano, possiamo creare un ramo e tutti quelli che lo desiderano posteranno i loro dati. Ecco il codice con il ridisegno di una parte degli oggetti.

Questo test testa più la velocità della coda di comunicazione asincrona con gli oggetti (funzione ObjectSetXXXX), ma non il sistema video.
 
Renat:
Questo test testa più la velocità della coda di comunicazione asincrona con gli oggetti (funzione ObjectSetXXXX), non il sistema video.

Non pretendo, ma forse non hai notato che prima dell'inizio del test è stato misurato il tempo ciclico di cambio degli oggetti, seguito dalla sottrazione di un multiplo del tempo dal totale.

   sto=GetTickCount();
   for(int i=0;i<CountObjRedrawt;i++)
      ObjectSetDouble(ChId,rand()%CountObj,OBJPROP_PRICE,1.+((i+1)/(double)CountObj));
   eno=GetTickCount();
   reso=eno-sto;
...
   " time=",GetTickCount()-st-(reso*Count)

Correggetemi se mi sbaglio.

SZY Unicamente non sconto if(i%2==0) ma non credo che questo test cambierà significativamente le cifre, abbiamo bisogno della cifra relativa su diversi videahas.

HH A proposito, misure simili sono ottenute senza ridisegnare, anche un po' di più, il che probabilmente dice che quando si usa spesso la funzione ObjectSetXXXXX, il suo lavoro è in qualche modo accelerato, e la deduzione del tempo è leggermente sovrastimata.

 
Urain:

Scrive:

Ora è così:

2012.02.27 19:37:44    gpu_Test (Urain) (EURUSD,M30)    ChartRedraw() Count=1000 CountObj=100000 CountObjRedrawt=1000 time=22792 mk.c.

CPU: AuthenticAMD AMD Phenom(tm) II X6 1100T Processor with OpenCL 1.1 (6 units, 3840 MHz, 16345 Mb, version 2.0)
GPU: Advanced Micro Devices, Inc. Cayman with OpenCL 1.1 (20 units, 750 MHz, 1024 Mb, version CAL 1.4.1664 (VM))


Ma questo è su uno schermo vuoto. Quando è così (512 linee sul display superiore e lo stesso sul display inferiore):


allora è così.

2012.02.27 19:47:53    gpu_Test (Urain) (EURUSD,M1)    ChartRedraw() Count=1000 CountObj=100000 CountObjRedrawt=1000 time=123022 mk.c.

E l'indicatore da solo non carica la GPU in questo momento (calcolo a zero bar sulla CPU), carica solo il rendering terminale di tutto questo casino.
 
Urain:

Non pretendo, ma forse non hai notato che prima dell'inizio del test è stato misurato il tempo ciclico di cambio degli oggetti, seguito dalla sottrazione di un multiplo del tempo dal totale.

Sì, non ho notato subito che c'è un'operazione di correzione.

Ma comunque la mia correzione è completamente corretta. La velocità di una coda asincrona (che è veramente una coda) dipende direttamente dal modo di funzionamento della coda.

In primo luogo, avete misurato la velocità della coda per scrittura senza stimoli esterni e senza operazioni di lettura da essa. Infatti è stato istantaneo (reso=0 ms, controllate voi stessi). Ma poi hai iniziato a usare non solo operazioni di scrittura ma anche di lettura tramite ChartRedraw nei tuoi test, il che ha iniziato a bloccare la coda di correzione e a sovrapporre tutte le operazioni.

In effetti, questo è un test di 1.000.000 di cambiamenti tra 1.000 oggetti in un set esistente di 100.000 oggetti. Non c'è modo di chiamare un test video usando le funzioni ObjectXXXx.

 
Renat:

Sì, non ho notato subito che c'è un'operazione di correzione.

Ma comunque la mia correzione è completamente corretta. La velocità di una coda asincrona (che in realtà è una coda) dipende direttamente dal modo di gestirla.

In primo luogo, avete misurato la velocità della coda per scrittura senza stimoli esterni e senza operazioni di lettura da essa. Infatti è stato istantaneo (reso=0 ms, controllate voi stessi). Ma poi hai iniziato a usare non solo operazioni di scrittura ma anche di lettura tramite ChartRedraw nei tuoi test, il che ha iniziato a bloccare la coda di correzione e a sovrapporre tutte le operazioni.

In effetti, questo è un test di 1.000.000 di cambiamenti tra 1.000 oggetti in un set esistente di 100.000 oggetti. Questo non può essere chiamato un test video utilizzando le funzioni ObjectXXXx.

E se misurassimo prima l'insieme completo di repaint senza ChartRedraw e poi con esso, e facessimo una sottrazione, sarebbe corretto?

A proposito, l'argomento è molto rilevante, potresti scrivere un test, è più facile per te conoscere la struttura interna di mql.

#property script_show_inputs
input uint Count=1000;
input uint CountObj=100000;
input uint CountObjRedrawt=1000;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
   long ChId=ChartID();
   uint sto,eno,reso;

   for(int i=0;i<CountObj;i++)
     {
      ObjHLine(ChId,i,1.+(i/(double)CountObj));
     }
   sto=GetTickCount();// замерим время вычета
   for(uint i=0; i<Count; i++)
     {
      if(i%2==0)
        {
         for(int j=0;j<CountObjRedrawt;j++)
            ObjectSetDouble(ChId,rand()%CountObj,OBJPROP_PRICE,1.2+((i+2)/(double)CountObj));
        }
      else
        {
         for(int j=0;j<CountObjRedrawt;j++)
            ObjectSetDouble(ChId,rand()%CountObj,OBJPROP_PRICE,1.2+((i+1)/(double)CountObj));
        }      
     }
   for(int i=0;i<CountObj;i++)// вернём всё в исходное состояние
     {
      ObjectSetDouble(ChId,i,OBJPROP_PRICE,1.+(i/(double)CountObj));
     }     
   eno=GetTickCount();
   reso=eno-sto;
   
   uint st=GetTickCount();
   for(uint i=0; i<Count; i++)
     {
      if(i%2==0)
        {
         for(int j=0;j<CountObjRedrawt;j++)
            ObjectSetDouble(ChId,rand()%CountObj,OBJPROP_PRICE,1.2+((i+2)/(double)CountObj));
        }
      else
        {
         for(int j=0;j<CountObjRedrawt;j++)
            ObjectSetDouble(ChId,rand()%CountObj,OBJPROP_PRICE,1.2+((i+1)/(double)CountObj));
        }
      ChartRedraw();
     }
   Alert("ChartRedraw() Count=",Count," CountObj=",CountObj," CountObjRedrawt=",CountObjRedrawt," time=",GetTickCount()-st-reso," mk.c.");
   ObjectsDeleteAll(ChId,0,OBJ_HLINE);
  }
//+------------------------------------------------------------------+
void ObjHLine(ulong chart_id,string name,double price)
  {
   ENUM_OBJECT  type=OBJ_HLINE; // тип объекта  
   int          nwin=0;                   // индекс окна   
//---
   if(ObjectFind(chart_id,name)<0)
      ObjectCreate(chart_id,name,type,nwin,0,0,0,0);
   ObjectSetInteger(chart_id,name,OBJPROP_COLOR,clrGreen);
   ObjectSetDouble(chart_id,name,OBJPROP_PRICE,price);
  }
//+------------------------------------------------------------------+
Motivazione: