Erros, bugs, perguntas - página 655

 
Urain:

Obrigado pela ligação, mas apenas uma pergunta complementar: este código pode ser utilizado para testar o desempenho da placa gráfica?

Não. Primeiro é preciso adicionar um par de milhões de objectos por página. E depois loop(10000){ ChartRedraw(); }

:)

 
MetaDriver:

Nah. Primeiro, terá de adicionar um par de milhões de objectos por página. E depois loop(10000){ ChartRedraw(); }

:)

Um par de milhões é demasiado, mas 100k é suficientemente bom para um teste.

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

É possível chamar-lhe "teste objectivo de adequação da placa de vídeo para MT5"?

Ou talvez os objectos também devam mudar os seus valores?

 
Urain:

Bem, um par de milhões é demasiado, mas 100k é suficientemente bom para testar.

É adequado? É possível chamar-lhe "teste objectivo de adequação da placa de vídeo para MT5"?

O que é que diz? :) eu tenho

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

 
MetaDriver:

O que é que diz? meu.

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


Vamos tentar redesenhar parte dos objectos, e especificar a CPU e a placa de vídeo. Se os criadores não a rejeitarem, então podemos criar uma filial e todos afixarão os seus dados. Aqui está o código com parte dos objectos a ser redesenhada.

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

aqui são reescritas mais impressões que eram visíveis em que definições.

Oops, os balcões internos precisam de ser mudados para j.

 

Escreve:

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:

Vamos tentar redesenhar parte dos objectos, e especificar a CPU e a placa de vídeo. Se os criadores não a rejeitarem, podemos criar um ramo e todos os que o desejarem publicarão os seus dados. Aqui está o código com parte redesenhada dos objectos.

Este teste testa mais a velocidade da fila de comunicação assíncrona com objectos (função ObjectSetXXXX), mas não o sistema de vídeo.
 
Renat:
Este teste testa mais a velocidade da fila de comunicação assíncrona com objectos (função ObjectSetXXXX), e não o sistema de vídeo.

Não estou a afirmar, mas talvez não tenha reparado que antes do início do teste, o tempo cíclico de mudança de objectos foi medido, seguido pela subtracção de um múltiplo do tempo do 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)

Corrija-me se estiver errado.

SZY Uniquely Não desconto se(i%2==0) mas penso que este teste não irá alterar significativamente os números, precisamos do número relativo em diferentes videahas.

HH A propósito, medições semelhantes são obtidas sem redesenhar, mesmo um pouco mais, o que provavelmente diz que quando se usa frequentemente a função ObjectSetXXXXX, o seu trabalho é de alguma forma acelerado, e a dedução de tempo é ligeiramente sobrestimada.

 
Urain:

Escreve:

É assim agora:

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


Mas isto está num ecrã em branco. Quando é assim (512 linhas no visor superior e o mesmo no visor inferior):


então é assim.

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

E o indicador por si só não carrega a GPU neste momento (cálculo em barra zero na CPU), carrega apenas a renderização terminal de toda esta confusão.
 
Urain:

Não estou a afirmar, mas talvez não tenha reparado que antes do início do teste, o tempo cíclico de mudança de objectos foi medido, seguido pela subtracção de um múltiplo do tempo do total.

Sim, não notei de imediato que existe uma operação de correcção.

Mas mesmo assim a minha correcção está completamente correcta. A velocidade de uma fila assíncrona (que é realmente uma fila) depende directamente do modo de funcionamento da fila.

Primeiro, mediu a velocidade da fila por escrito, sem estímulos externos e sem operações de leitura a partir dela. Na realidade, foi instantâneo (reso=0 ms, verifique por si mesmo). Mas depois começou a utilizar não só as operações de escrita mas também de leitura via ChartRedraw nos seus testes, que começaram a bloquear a fila para a revisão e sobreposição de todas as operações.

De facto, este é um teste de 1.000.000 alterações entre 1.000 objectos num conjunto existente de 100.000 objectos. Não há maneira de lhe chamar um teste de vídeo usando as funções ObjectXXXx.

 
Renat:

Sim, não notei de imediato que existe uma operação de correcção.

Mas mesmo assim a minha correcção está completamente correcta. A velocidade de uma fila assíncrona (que é realmente uma fila) depende directamente do modo de manuseamento da mesma.

Primeiro, mediu a velocidade da fila por escrito, sem estímulos externos e sem operações de leitura a partir dela. Na realidade, foi instantâneo (reso=0 ms, verifique por si mesmo). Mas depois começou a utilizar não só as operações de escrita mas também de leitura via ChartRedraw nos seus testes, que começaram a bloquear a fila para a revisão e sobreposição de todas as operações.

De facto, este é um teste de 1.000.000 alterações entre 1.000 objectos num conjunto existente de 100.000 objectos. Isto não pode ser chamado um teste de vídeo usando as funções ObjectXXXx.

E se primeiro medirmos o conjunto completo de pinturas sem ChartRedraw e depois com ele, e fizermos uma subtracção, seria correcto?

A propósito, o tema é muito relevante, poderia escrever um teste, é mais fácil para si conhecer a estrutura interna do 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);
  }
//+------------------------------------------------------------------+