OOP에 대한 도움말 - 페이지 6

 
정전기 제거를 잊지 마세요.
 
fxsaber # :

문제가 보이지 않습니다.

따라서 "union u_Data_t" 전에 "static"을 제거해야 합니다.

 static union u_Data_t
 
PapaYozh # :

따라서 "union u_Data_t" 전에 "static"을 제거해야 합니다.

Release: 12487.905
Debug: 9357.236

b3062. 실제로 불일치는 올바른 방향이 아닙니다.

 

숫자는 다음과 같습니다. 이전 테스트 후 코드가 약간 최적화되었습니다.

정적 디버그 및 릴리스 없음, 정적 릴리스 포함 최신

 174.326
13513.946
46.408
 
fxsaber # :

b3062. 실제로 불일치는 올바른 방향이 아닙니다.

그래서 차이가 거의 없다

 
Aliaksandr Hryshyn # :

그래서 약간의 차이가 있습니다

전체 코드와 결과가 포함된 최신 빌드의 분기에 작성합니다. 이러한 구성은 개발자에 의해 전달되지 않습니다.

 
fxsaber # :

즉시 답변하는 것이 바람직합니다. 실험할 시간이 항상 있는 것은 아닙니다.

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

간단히 말해서 더 빠른 포인터는 없습니다. 포인터(V1)가 없는 경우 1.2초, 포인터(V2)가 있는 경우 1.4초입니다. 1.6 - 포인터 및 삭제 포함(V3).

 
new 및 호출 메서드를 통해 생성된 개체의 경우 더 느립니다... 모르는 경우)))))
 
Vasiliy Sokolov # :

간단히 말해서 더 빠른 포인터는 없습니다. 포인터(V1) 없이 1.2초, 포인터(V2)가 있는 1.4초가 있습니다. 1.6 - 포인터 및 삭제 포함(V3).

잘못된 비교 때문에 개체의 자동 삭제 시간은 고려되지 않습니다.

변경됨.

 #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 이후의 123MB는 어디에서 왔는지 - 모르겠습니다.

 

다음은 비교를 위한 동일한 기능입니다.

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