Errores, fallos, preguntas - página 655

 
Urain:

Gracias por el enlace, pero sólo una pregunta complementaria: ¿se puede utilizar este código para probar el rendimiento de las tarjetas gráficas?

No. Primero hay que añadir un par de millones de objetos por página. Y luego loop(10000){ ChartRedraw(); }

:)

 
MetaDriver:

No. En primer lugar, tendrá que añadir un par de millones de objetos por página. Y luego loop(10000){ ChartRedraw(); }

:)

Un par de millones es demasiado, pero 100k es suficiente para una prueba.

#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);
  }
//+------------------------------------------------------------------+

¿Es posible llamarlo "prueba objetiva de idoneidad de la tarjeta de vídeo para MT5"?

¿O tal vez los objetos también deberían cambiar sus valores?

 
Urain:

Un par de millones es demasiado, pero 100k es suficiente para una prueba.

¿Es adecuado? ¿Es posible llamarlo "prueba objetiva de tarjeta de video para mt5"?

¿Qué dice? :) tengo

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

 
MetaDriver:

¿Qué dice? El mío.

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


Probemos a redibujar parte de los objetos, y a especificar la CPU y la tarjeta de vídeo. Si los desarrolladores no lo rechazan, podemos crear una rama y que todos publiquen sus datos. Aquí está el código con el redibujado de parte de los objetos.

#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);
  }
//+------------------------------------------------------------------+

aquí se reescribe más impresiones que era visible en lo que la configuración.

Oops, los contadores internos necesitan ser cambiados a j.

 

Escribe:

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:

Probemos a redibujar parte de los objetos, y a especificar la CPU y la tarjeta de vídeo. Si los desarrolladores no lo rechazan, podemos crear una rama y todos los que lo deseen publicarán sus datos. Aquí está el código con el rediseño de parte de los objetos.

Esta prueba comprueba más la velocidad de la cola de comunicación asíncrona con objetos (función ObjectSetXXXX), pero no el sistema de vídeo.
 
Renat:
Esta prueba comprueba más bien la velocidad de la cola de comunicación asíncrona con los objetos (función ObjectSetXXXX), no el sistema de vídeo.

No estoy afirmando, pero tal vez no te diste cuenta de que antes de comenzar la prueba, se midió el tiempo cíclico de cambio de objetos, seguido de la sustracción de un múltiplo del tiempo del total.

   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)

Corríjanme si me equivoco.

SZY Únicamente no descarto if(i%2==0) pero no creo que esta prueba cambie significativamente las cifras, necesitamos la cifra relativa en diferentes videahas.

HH Por cierto, se obtienen medidas similares sin redibujar, incluso un poco más, lo que probablemente dice que cuando se utiliza la función ObjectSetXXXXX a menudo, su trabajo se acelera de alguna manera, y la deducción de tiempo está ligeramente sobreestimada.

 
Urain:

Escribe:

Ahora es así:

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))


Pero esto es en una pantalla en blanco. Cuando es así (512 líneas en la pantalla superior y lo mismo en la inferior):


entonces es así.

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

Y el indicador por sí mismo no carga la GPU en este momento (cálculo a barra cero en la CPU), sólo carga el renderizado del terminal de todo este lío.
 
Urain:

No estoy afirmando, pero tal vez no te diste cuenta de que antes de comenzar la prueba, se midió el tiempo cíclico de cambio de objetos, seguido de la sustracción de un múltiplo del tiempo del total.

Sí, no me di cuenta enseguida de que hay una operación de corrección.

Pero aun así mi corrección es completamente correcta. La velocidad de una cola asíncrona (que en realidad es una cola) depende directamente del modo de funcionamiento de la cola.

En primer lugar, has medido la velocidad de la cola por escritura sin estímulos externos y sin operaciones de lectura de la misma. De hecho, fue instantáneo (reso=0 ms, compruébelo usted mismo). Pero entonces empezaste a utilizar no sólo operaciones de escritura sino también de lectura a través de ChartRedraw en tus pruebas, lo que empezó a bloquear la cola de corrección y a solapar todas las operaciones.

De hecho, se trata de una prueba de 1.000.000 de cambios entre 1.000 objetos de un conjunto existente de 100.000 objetos. No hay manera de llamar a una prueba de vídeo utilizando las funciones ObjectXXXx.

 
Renat:

Sí, no me di cuenta enseguida de que hay una operación de corrección.

Pero aun así mi corrección es completamente correcta. La velocidad de una cola asíncrona (que en realidad es una cola) depende directamente del modo de manejarla.

En primer lugar, has medido la velocidad de la cola por escritura sin estímulos externos y sin operaciones de lectura de la misma. De hecho, fue instantáneo (reso=0 ms, compruébelo usted mismo). Pero entonces empezaste a utilizar no sólo operaciones de escritura sino también de lectura a través de ChartRedraw en tus pruebas, lo que empezó a bloquear la cola de corrección y a solapar todas las operaciones.

De hecho, se trata de una prueba de 1.000.000 de cambios entre 1.000 objetos de un conjunto existente de 100.000 objetos. No se puede llamar a una prueba de vídeo con funciones ObjectXXXx.

Y si primero medimos el conjunto de repintados sin ChartRedraw y luego con él, y hacemos una resta, ¿sería correcto?

Por cierto, el tema es muy relevante, podrías escribir un test, te será más fácil conociendo la estructura interna de 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);
  }
//+------------------------------------------------------------------+