OOP ile ilgili yardım - sayfa 6

 
Statik kaldırmayı unutmayın
 
fxsaber # :

Ben bir problem görmüyorum.

Bu nedenle, "birlik u_Data_t" den önce "statik" ifadesini kaldırmanız gerekir.

 static union u_Data_t
 
PapaYozh # :

Bu nedenle, "birlik u_Data_t" den önce "statik" ifadesini kaldırmanız gerekir.

Release: 12487.905
Debug: 9357.236

b3062. Aslında, tutarsızlık doğru yönde değil.

 

Rakamlar aşağıdaki gibidir, önceki testten sonra kod biraz optimize edilmiştir:

Statik hata ayıklama ve sürüm olmadan, en son statik sürümle

 174.326
13513.946
46.408
 
fxsaber # :

b3062. Aslında, tutarsızlık doğru yönde değil.

yani çok az fark var

 
Aliaksandr Hryshyn # :

yani çok az fark var

En son derlemenin dalına tam kod ve sonuçlarla yazın. Böyle bir yapı geliştiriciler tarafından geçmeyecektir.

 
fxsaber # :

Hemen cevap verilmesi arzu edilir. Deneyler için her zaman zaman yoktur.

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

Kısacası: hiçbir işaretçi daha hızlı değildir. İşaretçiler olmadan 1,2 saniyem var (V1), 1.4 - işaretçiler ile (V2). 1.6 - işaretçiler ve silme ile (V3).

 
Yeni ve çağıran yöntemlerle oluşturulan nesneler için daha yavaştır... bilmiyorsanız)))))
 
Vasiliy Sokolov # :

Kısacası: hiçbir işaretçi daha hızlı değildir. İşaretçiler olmadan 1,2 saniyem var (V1) , 1.4 - işaretçilerle (V2). 1.6 - işaretçiler ve silme ile (V3).

Yanlış karşılaştırma çünkü nesnelerin otomatik olarak silinme süresi dikkate alınmaz.

Değişti.

 #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

V3'ten sonra 123 megabayt nereden geliyor - bilmiyorum.

 

Karşılaştırma için aynı işlevler şunlardır:

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