Fehler, Irrtümer, Fragen - Seite 655

 
Urain:

Danke für den Link, aber nur eine Folgefrage: Kann dieser Code verwendet werden, um die Leistung der Grafikkarte zu testen?

Nein. Zunächst müssen Sie ein paar Millionen Objekte pro Seite hinzufügen. Und dann loop(10000){ ChartRedraw(); }

:)

 
MetaDriver:

Nein. Zunächst müssen Sie ein paar Millionen Objekte pro Seite hinzufügen. Und dann loop(10000){ ChartRedraw(); }

:)

Ein paar Millionen sind zu viel, aber 100.000 sind gut genug für einen 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);
  }
//+------------------------------------------------------------------+

Ist das in Ordnung? Kann man es "objektiver Test der Eignung der Grafikkarte für MT5" nennen?

Oder sollten die Objekte vielleicht auch ihre Werte ändern?

 
Urain:

Ein paar Millionen sind zu viel, aber 100.000 sind gut genug für einen Test.

Kann man es als "objektiven Videokartentest für mt5" bezeichnen?

Was steht dort? :) ich habe

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

 
MetaDriver:

Was steht da? Meiner.

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


Versuchen wir, einen Teil der Objekte neu zu zeichnen und die CPU und die Grafikkarte anzugeben. Wenn die Entwickler dies nicht ablehnen, können wir einen Zweig erstellen und jeder wird seine Daten veröffentlichen. Hier ist der Code, bei dem ein Teil der Objekte neu gezeichnet wird.

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

hier werden weitere Ausdrucke umgeschrieben, die bei welchen Einstellungen sichtbar waren.

Ups, die internen Zähler müssen in j geändert werden.

 

Er schreibt:

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:

Versuchen wir, einen Teil der Objekte neu zu zeichnen und die CPU und die Grafikkarte anzugeben. Wenn die Entwickler dies nicht ablehnen, können wir einen Zweig erstellen und alle, die es wünschen, können ihre Daten posten. Hier ist der Code, bei dem ein Teil der Objekte neu gezeichnet wird.

Dieser Test testet eher die Geschwindigkeit der asynchronen Kommunikationswarteschlange mit Objekten (ObjectSetXXXX-Funktion), aber nicht das Videosystem.
 
Renat:
Dieser Test testet eher die Geschwindigkeit der asynchronen Kommunikationswarteschlange mit Objekten (ObjectSetXXXX-Funktion) und nicht das Videosystem.

Ich behaupte nicht, aber vielleicht ist Ihnen nicht aufgefallen, dass vor Beginn des Tests die zyklische Zeit des Objektwechsels gemessen und anschließend ein Vielfaches der Zeit von der Gesamtzeit abgezogen wurde.

   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)

Korrigieren Sie mich, wenn ich falsch liege.

SZY Eindeutig ich nicht diskontieren if(i%2==0), aber ich glaube nicht, dass dieser Test wird die Zahlen erheblich ändern, wir brauchen die relative Zahl auf verschiedenen videahas.

HH Übrigens werden ähnliche Messungen ohne Neuzeichnen erzielt, sogar etwas mehr, was wahrscheinlich besagt, dass bei häufiger Verwendung der Funktion ObjectSetXXXXX deren Arbeit irgendwie beschleunigt wird und der Zeitabzug leicht überschätzt wird.

 
Urain:

Er schreibt:

Jetzt ist es so:

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


Dies geschieht jedoch auf einem leeren Bildschirm. Wenn es so aussieht (512 Zeilen auf dem oberen Display und das gleiche auf dem unteren Display):


dann ist es so.

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

Und der Indikator selbst belastet zu diesem Zeitpunkt nicht die GPU (Berechnung bei Null-Bar auf CPU), sondern nur das Terminal-Rendering von all diesem Chaos.
 
Urain:

Ich behaupte nicht, aber vielleicht ist Ihnen nicht aufgefallen, dass vor Beginn des Tests die zyklische Zeit des Objektwechsels gemessen und anschließend ein Vielfaches der Zeit von der Gesamtzeit abgezogen wurde.

Ja, ich habe nicht sofort bemerkt, dass es einen Korrekturvorgang gibt.

Dennoch ist meine Korrektur völlig korrekt. Die Geschwindigkeit einer asynchronen Warteschlange (die eigentlich eine Warteschlange ist) hängt direkt von der Betriebsart der Warteschlange ab.

Zunächst haben Sie die Geschwindigkeit der Warteschlange pro Schreibvorgang ohne externe Stimuli und ohne Lesevorgänge gemessen. Sie erfolgte sogar sofort (reso=0 ms, überprüfen Sie es selbst). Doch dann begannen Sie, in Ihren Tests nicht nur Schreib-, sondern auch Leseoperationen über ChartRedraw zu verwenden, wodurch die Warteschlange für das Korrekturlesen blockiert wurde und sich alle Operationen überschnitten.

Tatsächlich handelt es sich um einen Test von 1.000.000 Änderungen bei 1.000 Objekten in einer bestehenden Menge von 100.000 Objekten. Es gibt keine Möglichkeit, einen Videotest mit ObjectXXXx-Funktionen aufzurufen.

 
Renat:

Ja, ich habe nicht sofort bemerkt, dass es einen Korrekturvorgang gibt.

Dennoch ist meine Korrektur völlig korrekt. Die Geschwindigkeit einer asynchronen Warteschlange (die eigentlich eine Warteschlange ist) hängt direkt von der Art ihrer Bearbeitung ab.

Zunächst haben Sie die Geschwindigkeit der Warteschlange pro Schreibvorgang ohne externe Stimuli und ohne Lesevorgänge gemessen. Sie erfolgte sogar sofort (reso=0 ms, überprüfen Sie es selbst). Doch dann begannen Sie, in Ihren Tests nicht nur Schreib-, sondern auch Leseoperationen über ChartRedraw zu verwenden, wodurch die Warteschlange für das Korrekturlesen blockiert wurde und sich alle Operationen überschnitten.

Tatsächlich handelt es sich um einen Test von 1.000.000 Änderungen bei 1.000 Objekten in einer bestehenden Menge von 100.000 Objekten. Dies kann nicht als Videotest mit ObjectXXXx-Funktionen bezeichnet werden.

Und wenn wir zuerst den kompletten Satz von Repaints ohne ChartRedraw und dann mit ChartRedraw messen und eine Subtraktion vornehmen, wäre das dann korrekt?

Übrigens, das Thema ist sehr relevant, Sie könnten einen Test schreiben, es ist einfacher für Sie, wenn Sie die interne Struktur von mql kennen.

#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);
  }
//+------------------------------------------------------------------+
Grund der Beschwerde: