Erreurs, bugs, questions - page 655

 
Urain:

Merci pour le lien, mais juste une question complémentaire : ce code peut-il être utilisé pour tester les performances des cartes graphiques ?

Non. Il faut d'abord ajouter quelques millions d'objets par page. Et ensuite boucle(10000){ ChartRedraw(); }

:)

 
MetaDriver:

Nah. Tout d'abord, vous devrez ajouter quelques millions d'objets par page. Et ensuite boucle(10000){ ChartRedraw() ; }

:)

Deux millions, c'est trop, mais 100 000, c'est suffisant pour 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);
  }
//+------------------------------------------------------------------+

Est-il possible de l'appeler "test objectif de l'adéquation de la carte vidéo à MT5" ?

Ou peut-être les objets devraient-ils également changer de valeur ?

 
Urain:

Deux millions, c'est trop, mais 100 000, c'est suffisant pour un test.

Est-il possible de l'appeler "test objectif de carte vidéo pour mt5" ?

Qu'est-ce que ça dit ? :) j'ai

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

 
MetaDriver:

Qu'est-ce que ça dit ? À moi.

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


Essayons de redessiner une partie des objets, et de spécifier le CPU et la carte vidéo. Si les développeurs ne le rejettent pas, alors nous pouvons créer une branche et tout le monde postera ses données. Voici le code avec le redécoupage d'une partie des objets.

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

ici est réécrit plus d'impressions qui était visible à quels paramètres.

Oups, les compteurs internes doivent être changés en j.

 

Ecrit :

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:

Essayons de redessiner une partie des objets, et de spécifier le CPU et la carte vidéo. Si les développeurs ne le rejettent pas, nous pouvons créer une branche et tous ceux qui le souhaitent posteront leurs données. Voici le code avec le redécoupage d'une partie des objets.

Ce test teste davantage la vitesse de la file de communication asynchrone avec les objets (fonction ObjectSetXXXX), mais pas le système vidéo.
 
Renat:
Ce test teste davantage la vitesse de la file d'attente de communication asynchrone avec les objets (fonction ObjectSetXXXX), et non le système vidéo.

Je ne prétends pas, mais peut-être n'avez-vous pas remarqué qu'avant le début du test, on mesurait le temps cyclique de changement d'objet, puis on soustrayait un multiple de ce temps au 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)

Corrigez-moi si je me trompe.

SZY Uniquement je n'écarte pas if(i%2==0) mais je ne pense pas que ce test changera significativement les chiffres, nous avons besoin du chiffre relatif sur les différentes vidéahas.

HH D'ailleurs, des mesures similaires sont obtenues sans redessiner, même un peu plus, ce qui indique probablement que lorsqu'on utilise souvent la fonction ObjectSetXXXXX, son travail est en quelque sorte accéléré, et la déduction de temps est légèrement surestimée.

 
Urain:

Ecrit :

C'est comme ça maintenant :

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


Mais c'est sur un écran vide. Quand c'est comme ça (512 lignes sur l'écran supérieur et la même chose sur l'écran inférieur) :


alors c'est comme ça.

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

Et l'indicateur en lui-même ne charge pas le GPU à ce moment-là (calcul à la barre zéro sur le CPU), il ne charge que le rendu terminal de tout ce bazar.
 
Urain:

Je ne prétends pas, mais peut-être n'avez-vous pas remarqué qu'avant le début du test, on mesurait le temps cyclique de changement d'objet, puis on soustrayait un multiple de ce temps au total.

Oui, je n'ai pas remarqué tout de suite qu'il y a une opération de correction.

Mais ma correction est tout à fait correcte. La vitesse d'une file d'attente asynchrone (qui est en fait une file d'attente) dépend directement du mode de fonctionnement de la file d'attente.

Tout d'abord, vous avez mesuré la vitesse de la file d'attente par écriture sans stimulus externe et sans opération de lecture de celle-ci. En fait, c'était instantané (reso=0 ms, vérifiez par vous-même). Mais ensuite, vous avez commencé à utiliser des opérations non seulement d'écriture mais aussi de lecture via ChartRedraw dans vos tests, ce qui a commencé à bloquer la file d'attente pour la relecture et à faire se chevaucher toutes les opérations.

En fait, il s'agit d'un test de 1 000 000 de changements parmi 1 000 objets dans un ensemble existant de 100 000 objets. Il n'y a aucun moyen d'appeler un test vidéo en utilisant les fonctions ObjectXXXx.

 
Renat:

Oui, je n'ai pas remarqué tout de suite qu'il y a une opération de correction.

Mais ma correction est tout à fait correcte. La vitesse d'une file d'attente asynchrone (qui est en fait une file d'attente) dépend directement du mode de manipulation de celle-ci.

Tout d'abord, vous avez mesuré la vitesse de la file d'attente par écriture sans stimulus externe et sans opération de lecture de celle-ci. En fait, c'était instantané (reso=0 ms, vérifiez par vous-même). Mais ensuite, vous avez commencé à utiliser des opérations non seulement d'écriture mais aussi de lecture via ChartRedraw dans vos tests, ce qui a commencé à bloquer la file d'attente pour la relecture et à faire se chevaucher toutes les opérations.

En fait, il s'agit d'un test de 1 000 000 de changements parmi 1 000 objets dans un ensemble existant de 100 000 objets. On ne peut pas appeler cela un test vidéo utilisant les fonctions ObjectXXXx.

Et si nous mesurons d'abord l'ensemble des repeints sans ChartRedraw, puis avec, et que nous faisons une soustraction, cela sera-t-il correct ?

D'ailleurs, le sujet est très pertinent, vous pourriez écrire un test, c'est plus facile pour vous de connaître la structure interne 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);
  }
//+------------------------------------------------------------------+