MQL5의 OOP에 대한 질문 - 페이지 69

 
fxsaber :
의외의 결과를 얻었습니다.


IMHO, 테스트는 비교할 수 없습니다

STRUCT2에는 생성자가 있습니다.

STRUCT2에 문자열이 있습니다.

https://www.mql5.com/ru/forum/1111/page2732#comment_16181920 논의된 MQL에서 구현된 문자열에 대한 문서가 없습니다.


저것들. 테스트에서 STRUCT2는 본질적으로 객체에 대한 메모리를 여러 번 할당하는 생성자가 있는 "문자열 클래스"를 포함하는 생성자가 있는 클래스로 작동합니다.

그런 복잡한 테스트는 여러 테스트로 나누어야 한다고 생각합니다. STRUCT1 및 STRUCT2 구조의 생성 시간을 테스트한 다음 데이터 액세스 시간을 테스트하려면 개발자 중 한 명이 문자열에 액세스한 후에만 문자열의 메모리가 할당된다고 썼습니다. - 귀하의 예에서 문자열은 일반적으로 상수 문자열로 초기화되며, 초기화가 어떻게 발생하는지 추측하기 어렵습니다. - 컴파일러는 문자열 배열에 액세스하기 전에 문자열 배열을 전혀 초기화할 수 없었습니다(또는 메모리를 할당하지 않았습니까? ).

 
Igor Makanu :

그런 복잡한 테스트는 여러 테스트로 나누어야 한다고 생각합니다

장난치고 싶지도 않습니다. 간단한 구조를 만들었습니다.

 #include <fxsaber\Benchmark.mqh> // https://c.mql5.com/3/321/Benchmark.mqh

// Простая структура.
struct STRUCT1
{
   int i;
   double j[ 2 ];
};

// Простая структура большего размера.
struct STRUCT3
{
   int i;
   double j[ 10 ];
};

template < typename T>
int Func( T &Array[] )
{  
   // Write
   for ( int i = ArraySize (Array) - 1 ; i >= 0 ; i--)
    Array[i].i = i;

   int Sum = 0 ;
  
   // Read
   for ( int i = ArraySize (Array) - 1 ; i >= 0 ; i--)
    Sum += Array[i].i;
    
   return (Sum + ArraySize (Array));    
}

#include <Debug.mqh>

void OnStart ()
{
  STRUCT1 Array1[]; // Простая структура.
  STRUCT3 Array3[]; // Простая структура большего размера.
  
   const int Amount = 5 e7;
  
   Print (_B( ArrayResize (Array1, Amount), 1 ));
   Print (_B( ArrayResize (Array3, Amount), 1 ));
      
   Print (_B(Func(Array1), 1 )); // Чтение и запись простой структуры
   Print (_B(Func(Array3), 1 )); // зависит от ее размеров.
  
  _P2( sizeof (STRUCT1));
  _P2( sizeof (STRUCT3));
}


         50000000
         50000000
         Alert : Time[Test6.mq5 280 : Func(Array1)] = 312 ms.
         1333106752
         Alert : Time[Test6.mq5 281 : Func(Array3)] = 1348 ms.
         1333106752
        : sizeof (STRUCT1) = 20
        : sizeof (STRUCT3) = 84


단순 구조의 첫 번째 필드에 대한 액세스가 크기에 따라 달라지는 이유 - 명확하지 않습니다.

 
fxsaber :

장난치고 싶지도 않습니다. 간단한 구조를 만들었습니다.



단순 구조의 첫 번째 필드에 대한 액세스가 크기에 따라 달라지는 이유 - 명확하지 않습니다.

이 질문은 적절한 스레드에서 개발자에게 묻는 것이 좋습니다. 테스트 코드와 함께. 그들은 설명하거나 수정하거나 아무 말도하지 않을 것입니다 ... 여기, 확실히 세 번째 옵션 만 있습니다.

 
Artyom Trishkin :

이 질문은 적절한 스레드에서 개발자에게 묻는 것이 좋습니다. 테스트 코드로. 그들은 설명하거나 수정하거나 아무 말도하지 않을 것입니다 ... 여기, 확실히 세 번째 옵션 만 있습니다.

내 MT5는 너무 많은 욕설이 발생했습니다. 치명적인 버그가 있습니다. 헛소리야.

 
fxsaber :

장난치고 싶지도 않습니다. 간단한 구조를 만들었습니다.

이제 동일한 테스트 STRUCT1 및 STRUCT3

fxsaber :

단순 구조의 첫 번째 필드에 대한 액세스가 크기에 따라 달라지는 이유 - 명확하지 않습니다.

여기에서는 커피 찌꺼기에 대해서만 추측합니다.

옵션 으로 C ++에서 동일한 테스트를 수행하고 결과를 보여줄 사람을 기다리십시오. 불일치가 크면 MQL의 메모리 할당 이 제대로 구현되지 않습니다.

테스트 1과 2가 거의 같다면 이것이 Windows가 메모리를 할당하는 방법입니다.

 
fxsaber :

내 MT5는 너무 많은 욕설이 발생했습니다. 치명적인 버그가 있습니다. 헛소리야.

모든 버그를 보고하십시오. 중요하고 아니요. 물론 무감정 :)

 
Igor Makanu :

테스트 1과 2가 거의 같다면 이것이 Windows가 메모리를 할당하는 방법입니다.

마지막 테스트를 2번 실행했습니다.

단말기 MetaQuotes Software Corp를 위해 MetaTrader 5 x64 빌드 2470이 시작되었습니다.

Windows 10 빌드 18363, Intel Core i3-4170 @ 3.70GHz, 8/11Gb 메모리, 188/297Gb 디스크, IE 11, UAC, GMT+4

2020.05.30 17:01:27.996 tst_f (EURUSD,H1) 경고: 시간[tst_f.mq5 53: ArrayResize (Array1,Amount)] = 1ms.

2020.05.30 17:01:27.996 tst_f (EURUSD,H1) 50000000

2020.05.30 17:01:28.002 tst_f (EURUSD,H1) 경고: 시간[tst_f.mq5 54: ArrayResize(Array3,Amount)] = 6ms.

2020.05.30 17:01:28.002 tst_f (EURUSD,H1) 50000000

2020.05.30 17:01:28.515 tst_f (EURUSD,H1) 경고: 시간[tst_f.mq5 56: Func(Array1)] = 512ms.

2020.05.30 17:01:28.515 tst_f (EURUSD,H1) 1333106752

2020.05.30 17:01:30.734 tst_f (EURUSD,H1) 경고: 시간[tst_f.mq5 57: Func(Array3)] = 2218ms.

2020.05.30 17:01:30.734 tst_f (EURUSD,H1) 1333106752

2020.05.30 17:01:41.278 tst_f (EURUSD,H1) 경고: 시간[tst_f.mq5 53: ArrayResize(Array1,Amount)] = 2ms.

2020.05.30 17:01:41.278 tst_f (EURUSD,H1) 50000000

2020.05.30 17:01:41.287 tst_f (EURUSD,H1) 경고: 시간[tst_f.mq5 54: ArrayResize(Array3,Amount)] = 9ms.

2020.05.30 17:01:41.287 tst_f (EURUSD,H1) 50000000

2020.05.30 17:01:41.840 tst_f (EURUSD,H1) 경고: 시간[tst_f.mq5 56: Func(Array1)] = 552ms.

2020.05.30 17:01:41.840 tst_f (EURUSD,H1) 1333106752

2020.05.30 17:01:43.728 tst_f (EURUSD,H1) 경고: 시간[tst_f.mq5 57: Func(Array3)] = 1888ms.

2020.05.30 17:01:43.728 tst_f (EURUSD,H1) 1333106752


모든 파일이 스크립트에 첨부된 것은 아니며 마지막 줄이 컴파일되지 않았습니다.

   //_P2(sizeof(STRUCT1));
//  _P2(sizeof(STRUCT3));

Debug.mqh가 포함되어 있습니다.


UPD: 이전 빌드에서 테스트를 실행했습니다.

2020.05.30 17:17:27.604 단말기 메타 트레이더 5 - 빌드 2361



2020.05.30 17:13:17.046 tst (EURUSD,H1) 경고: 시간[tst.mq5 53: ArrayResize(Array1,Amount)] = 1ms.

2020.05.30 17:13:17.047 tst (EURUSD,H1) 50000000

2020.05.30 17:13:17.053 tst (EURUSD,H1) 경고: 시간[tst.mq5 54: ArrayResize(Array3,Amount)] = 6ms.

2020.05.30 17:13:17.053 tst (EURUSD,H1) 50000000

2020.05.30 17:13:17.563 tst (EURUSD,H1) 경고: 시간[tst.mq5 56: Func(Array1)] = 510ms.

2020.05.30 17:13:17.563 tst (EURUSD,H1) 1333106752

2020.05.30 17:13:19.416 tst (EURUSD,H1) 경고: 시간[tst.mq5 57: Func(Array3)] = 1852ms.

2020.05.30 17:13:19.416 tst (EURUSD,H1) 1333106752

2020.05.30 17:13:28.971 tst (EURUSD,H1) 경고: 시간[tst.mq5 53: ArrayResize(Array1,Amount)] = 2ms.

2020.05.30 17:13:28.971 tst (EURUSD,H1) 50000000

2020.05.30 17:13:28.977 tst (EURUSD,H1) 경고: 시간[tst.mq5 54: ArrayResize(Array3,Amount)] = 6ms.

2020.05.30 17:13:28.977 tst (EURUSD,H1) 50000000

2020.05.30 17:13:29.456 tst (EURUSD,H1) 경고: 시간[tst.mq5 56: Func(Array1)] = 478ms.

2020.05.30 17:13:29.456 tst (EURUSD,H1) 1333106752

2020.05.30 17:13:31.192 tst (EURUSD,H1) 경고: 시간[tst.mq5 57: Func(Array3)] = 1735ms.

2020.05.30 17:13:31.192 tst (EURUSD,H1) 1333106752

유사한 결과 - 동일한 행동
 
그리고 장소에서 그들의 광고를 바꾸려고 노력하십시오. 스택의 맨 위에 있는 항목에 따라 달라지지 않습니까?
 
Artyom Trishkin :

모든 버그를 보고하십시오. 중요하고 아니요. 물론 무감정 :)

자세한 스레드를 생성했습니다.

 
Vladimir Simakov :
그리고 장소에서 그들의 광고를 바꾸려고 노력하십시오. 스택의 맨 위에 있는 항목에 따라 달라지지 않습니까?
 void OnStart ()
{
  STRUCT3 Array3[]; // Простая структура большего размера.
  STRUCT1 Array1[]; // Простая структура.
  
  
   const int Amount = 5 e7;
  
   Print (_B( ArrayResize (Array3, Amount), 1 ));
   Print (_B( ArrayResize (Array1, Amount), 1 ));
  
      
   Print (_B(Func(Array3), 1 )); // зависит от ее размеров.
   Print (_B(Func(Array1), 1 )); // Чтение и запись простой структуры
  
   //_P2(sizeof(STRUCT1));
//  _P2(sizeof(STRUCT3));
}

2020.05.30 17:33:07.892 tst_f (EURUSD,H1) 경고: 시간[tst_f.mq5 54: ArrayResize (Array3,Amount)] = 6ms.

2020.05.30 17:33:07.955 tst_f (EURUSD,H1) 50000000

2020.05.30 17:33:07.957 tst_f (EURUSD,H1) 경고: 시간[tst_f.mq5 55: ArrayResize(Array1,Amount)] = 1ms.

2020.05.30 17:33:07.957 tst_f (EURUSD,H1) 50000000

2020.05.30 17:33:09.902 tst_f (EURUSD,H1) 경고: 시간[tst_f.mq5 58: Func(Array3)] = 1945ms.

2020.05.30 17:33:09.902 tst_f (EURUSD,H1) 1333106752

2020.05.30 17:33:10.353 tst_f (EURUSD,H1) 경고: 시간[tst_f.mq5 59: Func(Array1)] = 450ms.

2020.05.30 17:33:10.353 tst_f (EURUSD,H1) 1333106752

내 생각에는 아무것도 바뀌지 않았다