Hilfe bei OOP - Seite 6

 
Vergessen Sie nicht, die statische Aufladung zu entfernen
 
fxsaber #:

Ich sehe das Problem nicht.

Sie müssen "static" vor "union u_Data_t" entfernen.

static union u_Data_t
 
PapaYozh #:

Sie müssen also "static" vor "union u_Data_t" entfernen.

Release: 12487.905
Debug: 9357.236

b3062. Die Divergenz geht in der Tat in die falsche Richtung.

 

Die Zahlen sehen so aus, dass der Code nach dem vorherigen Test leicht optimiert wurde:

Ohne statisches Debugging und Freigabe, zuletzt mit statischer Freigabe

174.326
13513.946
46.408
 
fxsaber #:

b3062. Die Diskrepanz geht in der Tat in die falsche Richtung.

Sie haben also einen kleinen Unterschied

 
Aliaksandr Hryshyn #:

Sie haben also einen kleinen Unterschied

Geben Sie den Zweig des neuesten Builds mit vollständigem Code und Ergebnissen an. Ein solches Konstrukt wird nicht an den Entwicklern vorbeikommen.

 
fxsaber #:

Die Antwort lautet vorzugsweise sofort. Es ist nicht immer Zeit für Experimente.

#define               ARRAY_SIZE           int(100)
#include <Arrays\ArrayObj.mqh>
class Test : public CObject
{
public:
   int               a;
   double            b;
   datetime          c;
   Test(){};
   Test(int ai){this.a = ai;}
};
int COUNT = 1000000;
 
void OnStart()
{
   FooV3();
}

void FooV1()
{
   long t = GetMicrosecondCount();
   Test array[];
   ArrayResize(array, COUNT);
   for(int i = 0; i < COUNT; i++)
      array[i] = Test(MathRand());
   long delta = GetMicrosecondCount() - t;
   printf(delta);
}
void FooV2()
{
   long t = GetMicrosecondCount();
   Test* array[];
   ArrayResize(array, COUNT);
   for(int i = 0; i < COUNT; i++)
      array[i] = new Test(MathRand());
   long delta = GetMicrosecondCount() - t;
   printf(delta);
}
void FooV3()
{
   long t = GetMicrosecondCount();
   Test* array[];
   ArrayResize(array, COUNT);
   for(int i = 0; i < COUNT; i++)
      array[i] = new Test(MathRand());
   for(int i = 0; i < COUNT; i++)
      delete (array[i]);
   long delta = GetMicrosecondCount() - t;
   printf(delta);
}

Kurz gesagt: Ohne Zeiger ist es schneller. Ich habe 1,2 Sekunden ohne Zeiger (V1), 1,4 mit Zeigern (V2). 1.6 - mit Zeigern und Entfernung (V3).

 
Mit new und Methodenaufrufen erstellte Objekte sind langsamer... falls Sie es noch nicht wussten)))))
 
Vasiliy Sokolov #:

Kurz gesagt: Ohne Zeiger geht es schneller. Ich habe 1,2 Sekunden ohne Zeiger (V1), 1,4 mit Zeigern (V2). 1.6 - mit Zeigern und Entfernung (V3).

Der Vergleich ist nicht korrekt, da er die Zeit, die für das automatische Löschen von Objekten benötigt wird, nicht berücksichtigt.

Geändert.

#include <Arrays\ArrayObj.mqh>
class Test : public CObject
{
public:
   int               a;
   double            b;
   datetime          c;
   Test(){};
   Test(int ai){this.a = ai;}
};
int COUNT = 1000000;

#include <fxsaber\Benchmark\Benchmark.mqh> // https://www.mql5.com/ru/code/31279
 
void OnStart()
{
   Print(MQLInfoInteger(MQL_MEMORY_USED));
   _BV(FooV1(), 1);
   Print(MQLInfoInteger(MQL_MEMORY_USED));
   _BV(FooV3(), 1);
   Print(MQLInfoInteger(MQL_MEMORY_USED));
}

void FooV1()
{
   Test array[];
   ArrayResize(array, COUNT);
   for(int i = 0; i < COUNT; i++)
      array[i] = Test(MathRand());
}

void FooV3()
{
   Test* array[];
   ArrayResize(array, COUNT);
   for(int i = 0; i < COUNT; i++)
      array[i] = new Test(MathRand());
   for(int i = 0; i < COUNT; i++)
      delete (array[i]);
}


1
Alert: Bench_Stack = 0, 1 <= Time[Test19.mq5 532 in OnStart: FooV1()] = 108805 mcs.
1
Alert: Bench_Stack = 0, 1 <= Time[Test19.mq5 534 in OnStart: FooV3()] = 116705 mcs.
123

Woher die 123 Megabyte nach V3 kommen, weiß ich nicht.

 

Hier sind die identischen Funktionen zum Vergleich:

void f1(){
   CX x[10];
}

void f2(){
   CX * x[10];
   for(int i=0;i<10;i++){
      x[i]=new CX();   
   }
   for(int i=0;i<10;i++){
      delete x[i]; 
   }
}