Aide sur la POO - page 6

 
N'oubliez pas d'enlever l'électricité statique
 
fxsaber #:

Je ne vois pas le problème.

Vous devez supprimer "static" avant "union u_Data_t".

static union u_Data_t
 
PapaYozh #:

Vous devez donc supprimer "static" avant "union u_Data_t".

Release: 12487.905
Debug: 9357.236

b3062. En effet, la divergence est dans la mauvaise direction.

 

Les chiffres sont les suivants : après le test précédent, le code a été légèrement optimisé :

Sans débogage et libération statique, dernière avec libération statique

174.326
13513.946
46.408
 
fxsaber #:

b3062. En effet, l'écart est dans la mauvaise direction.

Vous avez donc une petite différence

 
Aliaksandr Hryshyn #:

Vous avez donc une petite différence

Écrivez dans la branche de la dernière construction avec le code complet et les résultats. Une telle construction ne passera pas auprès des développeurs.

 
fxsaber #:

La réponse est de préférence immédiate. On n'a pas toujours le temps de faire des expériences.

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

En bref : c'est plus rapide sans pointeurs. J'ai 1,2 sec sans pointeurs (V1), 1,4 avec pointeurs (V2). 1.6 - avec pointeurs et suppression (V3).

 
Les objets créés avec new et les appels de méthode sont plus lents... au cas où vous ne le sauriez pas)))))
 
Vasiliy Sokolov #:

En bref : c'est plus rapide sans pointeurs. J'ai 1,2 sec sans pointeurs (V1), 1,4 avec pointeurs (V2). 1.6 - avec pointeurs et suppression (V3).

La comparaison est incorrecte car elle ne tient pas compte du temps nécessaire à la suppression automatique des objets.

Modifié.

#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

D'où viennent les 123 mégaoctets après V3, je ne sais pas.

 

Voici les fonctions identiques à titre de comparaison :

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]; 
   }
}