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

 
Igor Makanu :

다음과 같이 클래스를 작성하는 경우:

연구 결과에 따르면, 계산에 구조 필드를 자주 사용하면 클래스 B 가 느려질까요?

그래서 객체 배열을 우회하는 시간에 대해 논의했습니다)))

귀하의 예에 따르면 장점은 동일하지만 mql - 뉘앙스에는 먼저 두 개의 암시적 필드가 있으므로 오프셋을 통해 데이터 필드에 액세스합니다. 즉, 역참조 시 추가 계산이 있습니다.

 
Vladimir Simakov :

그래서 객체 배열을 우회하는 시간에 대해 논의했습니다)))

귀하의 예에 따르면 장점은 동일하지만 mql - 뉘앙스에는 먼저 두 개의 암시적 필드가 있으므로 오프셋을 통해 데이터 필드에 액세스합니다. 즉, 역참조 시 추가 계산이 있습니다.

감사합니다. 도움이 됩니다!

 
Vladimir Simakov :

그래서 객체 배열을 우회하는 시간에 대해 논의했습니다)))

귀하의 예에 따르면 장점은 동일하지만 mql - 뉘앙스에는 먼저 두 개의 암시적 필드가 있으므로 오프셋을 통해 데이터 필드에 액세스합니다. 즉, 역참조 시 추가 계산이 있습니다.

두 클래스는 비슷합니다. 액세스는 두 경우 모두 오프셋으로 진행됩니다. 구조 시작을 기준으로 하는 것이 아니라 클래스 시작을 기준으로 합니다. 저것들. 구조 자체는 무중력입니다. 오버헤드는 클래스에 의해서만 생성됩니다.
 
Vladimir Simakov :

따라서 신비주의가 없습니다. 물리 법칙이 작용합니다.

그것은 "물리학의 법칙"에 맞지 않습니다.

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

long f1( const int Size, const long Amount = 5 e9 )
{
   long Sum = 0 ;
  
   for ( long i = 0 ; i < Amount; i++)
  {
    Sum += Size * i ;
    
    Sum |= 1 ;
  }
    
   return (Sum);
}

long f2( const int Size, const long Amount = 5 e9 )
{
   long Sum = 0 ;
  
   for ( long i = 0 ; i < Amount; i++)
  {
    Sum += Size * (Amount - i) ;
    
    Sum |= 1 ;
  }
    
   return (Sum);
}

void OnStart ()
{
   Print (_B(f1( 2 ), 1 ));
   Print (_B(f1( 200 ), 1 ));
  
   Print (_B(f2( 2 ), 1 ));
   Print (_B(f2( 200 ), 1 ));
}


         Alert : Time[Test6.mq5 267 : f1( 2 )] = 3252 ms.
         6553255921290448385
         Alert : Time[Test6.mq5 268 : f1( 200 )] = 4602 ms.
        - 8757194524499019775
         Alert : Time[Test6.mq5 270 : f2( 2 )] = 3061 ms.
         6553255931290448385
         Alert : Time[Test6.mq5 271 : f2( 200 )] = 3112 ms.
        - 8757193524499019775


역설적인 결과가 나왔습니다. 더 복잡한 계산은 1.5배 더 빠르게 수행되며 크기에 의존하지 않습니다.

 
Vladimir Simakov :

그래서 객체 배열을 우회하는 시간이 논의되었습니다)))

귀하의 예에 따르면 장점은 동일하지만 mql - 뉘앙스에는 먼저 두 개의 암시적 필드가 있으므로 오프셋을 통해 데이터 필드에 액세스합니다. 즉, 역참조 시 추가 계산이 있습니다.

어셈블러 연구에 대해 Vladimir에게 감사드립니다.
그리고 Aleksey가 제안한 것처럼 오버헤드는 클래스에 의해 생성됩니다.
이것으로부터 우리는 클래스 없이 할 수 있다면 절차적 스타일로 코드를 작성하는 것이 더 낫다는 결론을 내릴 수 있습니다.
즉, 작업에 속도가 필요하지 않으면 클래스로 래핑할 수 있지만 예를 들어 틱으로 작업하는 경우 래퍼 없이 직접 사용하는 것이 좋습니다.
원칙적으로 나는 이 접근법을 따랐고, 종종 클래스의 어떤 종류의 예를 발견한 후 해당 메소드를 절차적 접근법으로 구문 분석했습니다.

 
Roman :

어셈블러 연구에 대해 Vladimir에게 감사드립니다.
그리고 Aleksey가 제안한 것처럼 오버헤드는 클래스에 의해 생성됩니다.
이것으로부터 우리는 클래스 없이 할 수 있다면 절차적 스타일로 코드를 작성하는 것이 더 낫다는 결론을 내릴 수 있습니다.
즉, 작업에 속도가 필요하지 않으면 클래스로 래핑할 수 있지만 예를 들어 틱으로 작업하는 경우 래퍼 없이 직접 사용하는 것이 좋습니다.
원칙적으로 나는 이 접근법을 따랐고, 종종 클래스의 어떤 종류의 예를 발견한 후 해당 메소드를 절차적 접근법으로 구문 분석했습니다.

포럼에 트롤이 있다...
이전에는 일부 사용자가 무시 기능을 도입하라고 요청하는 이유를 이해하지 못했습니다. 오, 지금은 어떻게 누락되었습니다 ...

 

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

MQL5의 OOP에 대한 질문

fxsaber , 2020.05.30 14:06

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

         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

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

배열에서 50M 요소를 사용하고 있습니다.
크기가 20바이트 및 84바이트인 구조의 경우 각각 0.93GB 및 3.91GB의 데이터입니다.
그리고 계산의 일부로 아마도 그 모든 메모리가 프로세서의 캐시를 통과할 것입니다.
그리고 얻은 결과에 대한 매우 논리적인 설명은 0.93GB 크기의 데이터가 3.91GB 크기의 데이터보다 4배 빠른 속도로 메모리에서 프로세서 캐시로 로드된다는 것입니다.

그리고 C++로 테스트한 결과는 어떻습니까?
어셈블러 코드는 봤는데 테스트 결과가 안 보이거나 안 좋은 건가요?
 
Sergey Dzyublik :

포럼에 트롤이 있다...
이전에는 일부 사용자가 무시 기능을 도입하라고 요청하는 이유를 이해하지 못했습니다. 오, 지금은 어떻게 누락되었습니다 ...

당신은 다른 사람이 아닌 자신을 돌볼 것입니다.
당신을 위한 것도 아니고 당신을 위한 것도 아닌 것이 답이었습니다.
조용히 무시))

 
Sergey Dzyublik :
배열에서 5천만 개의 요소를 사용하고 있습니다.
크기가 20바이트 및 84바이트인 구조의 경우 각각 0.93GB 및 3.91GB의 데이터입니다.
그리고 계산의 일부로 아마도 그 모든 메모리가 프로세서의 캐시를 통과할 것입니다.
그리고 얻은 결과에 대한 매우 논리적인 설명은 0.93GB 크기의 데이터가 3.91GB 크기의 데이터보다 4배 빠른 속도로 메모리에서 프로세서 캐시로 로드된다는 것입니다.

그리고 C++로 테스트한 결과는 어떻습니까?
어셈블러 코드는 봤는데 테스트 결과가 안 보이거나 안 좋은 건가요?
비슷하게 얻었습니다. 조금 더 빠르지만 비율이 같으므로 하드웨어입니다.
 
Roman :

어셈블러 연구에 대해 Vladimir에게 감사드립니다.
그리고 Aleksey가 제안한 것처럼 클래스는 오버헤드를 생성합니다.
이것으로부터 우리는 클래스 없이 할 수 있다면 절차적 스타일로 코드를 작성하는 것이 더 낫다는 결론을 내릴 수 있습니다.
즉, 작업에 속도가 필요하지 않으면 클래스로 래핑할 수 있지만 예를 들어 틱으로 작업하는 경우 래퍼 없이 직접 사용하는 것이 좋습니다.
원칙적으로 나는 이 접근 방식을 따랐고, 종종 클래스의 어떤 종류의 예를 발견한 후 해당 메서드를 절차적 접근 방식으로 구문 분석했습니다.

클래스 대신 구조가 가능하며 모든 것이 괜찮습니다.