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

 
Igor Makanu :
동일한 값, 어떤 이유로 테스트 속도가 "부동"하지만 참조로 메서드에 매개변수를 전달하는 것이 훨씬 더 효율적입니다.

그런 다음 다른 옵션:

 class E
{
   double f1( double a, double b )  { return (a + 1.0 /( 1.0 +( double ) rand ())); }
   double f2( double a, double b )  { return (b + 1.0 /( 1.0 +( double ) rand ())); }
   double f3( double a, double b )  { return (a/b + 1.0 /( 1.0 +( double ) rand ())); }
   
public :
   double calc( const MqlTick & tick )
   {
       return f1( tick.ask, tick.bid ) + f2( tick.ask, tick.bid ) + f3( tick.ask, tick.bid );
   }
};
 
Koldun Zloy :

그런 다음 다른 옵션:

2020.07.26 10:10:52.254 class_global (EURUSD,H1) 클래스 A :: 루프 = 10000000000ms=46141

2020.07.26 10:11:30.261 class_global (EURUSD,H1) 클래스 B :: 루프 = 10000000000 ms=38000

2020.07.26 10:12:08.258 class_global (EURUSD,H1) 클래스 C :: 루프 = 10000000000ms=38000

2020.07.26 10:12:46.254 class_global (EURUSD,H1) 클래스 D :: 루프 = 10000000000ms=38000

2020.07.26 10:13:24.279 class_global (EURUSD,H1) 클래스 E :: 루프 = 10000000000ms=38031

2020.07.26 10:14:10.484 class_global (EURUSD,H1) 클래스 A :: 루프 = 10000000000ms=46203

2020.07.26 10:14:48.570 class_global (EURUSD,H1) 클래스 B :: 루프 = 10000000000ms=38078

2020.07.26 10:15:26.737 class_global (EURUSD,H1) 클래스 C :: 루프 = 10000000000ms=38172

2020.07.26 10:16:04.734 class_global (EURUSD,H1) 클래스 D :: 루프 = 10000000000ms=38000

2020.07.26 10:16:42.739 class_global (EURUSD,H1) 클래스 E :: 루프 = 10000000000ms=38000

2020.07.26 10:17:28.886 class_global (EURUSD,H1) 클래스 A :: 루프 = 10000000000ms=46141

2020.07.26 10:18:06.894 class_global (EURUSD,H1) 클래스 B :: 루프 = 10000000000ms=38015

2020.07.26 10:18:44.888 class_global (EURUSD,H1) 클래스 C :: 루프 = 10000000000ms=38000

2020.07.26 10:19:22.948 class_global (EURUSD,H1) 클래스 D :: 루프 = 10000000000ms=38047

2020.07.26 10:20:00.983 class_global (EURUSD,H1) 클래스 E :: 루프 = 10000000000ms=38047

이상하지만 차이가 없다

UPD: 내가 틀리지 않았다면 MT4년 전에 오류를 찾고 있었습니다. 참조로가 아닌 함수에 인수를 전달한 다음 , 함수 본문에서 함수 의 인수 중 하나를 변경했습니다. 그래서 참조로 전달되지 않은 인수를 변경할 수 있었고 옵션 E에 있을 수 있으며 컴파일러는 모든 인수를 참조로 전달합니다.

 
Igor Makanu :
이상하지만 차이가 없다

이상하지 않습니다. 더블 - 8바이트, 링크도 8바이트입니다. 그러나 링크는 여전히 8바이트의 숫자를 가져와야 합니다.

 
Koldun Zloy :

이상하지 않습니다. 더블 - 8바이트, 링크도 8바이트입니다. 그러나 링크는 여전히 8바이트의 숫자를 가져와야 합니다.

그래서 논리적이고 숫자는 8이 거기에 수렴하고 8이 뒤로 수렴))

그러나 버스는 프로세서의 8비트가 아닙니까? 8바이트 = 사이클당 64비트를 읽어야 합니까?

 
Igor Makanu :

그래서 논리적이고 숫자는 8이 거기에 수렴하고 8이 뒤로 수렴))

그러나 버스는 프로세서의 8비트가 아닙니까? 8바이트 = 사이클당 64비트를 읽어야 합니까?

그렇게 간단하지 않습니다. 속도는 또한 개체가 있는 메모리와 기타 이유에 따라 다릅니다.

실제 프로그램에서 결과는 간단한 테스트의 결과와 매우 다를 수 있습니다.

클래스와 구조는 일반적으로 참조로 전달됩니다.

단순 유형은 참조를 통해 일부 값이 반환되는 경우에만 참조로 전달됩니다.

 

이 구조가 함수의 결과로 반환된 경우에도 구조의 필드에 액세스할 수 있다는 사실에 놀랐습니다.

이 코드는 올바르게 작동합니다(함수의 구조를 채운 다음 함수의 결과를 바이트 배열에 복사)

 struct UcharArray
{
   uchar              byte[];
};
//+------------------------------------------------------------------+
UcharArray f()
{
   UcharArray result;
   for ( uchar i = 0 ; i < 10 ; i++)
   {
       uchar tmp[ 1 ];
      tmp[ 0 ] = i;
       ArrayCopy (result.byte, tmp, ArraySize (result.byte));
   }
   return result;
}
//+------------------------------------------------------------------+
void OnStart ()
{
   uchar arr[];
   for ( int i = 0 ; i < 3 ; i++)
   {
       ArrayCopy (arr, f().byte , ArraySize (arr));
   }
   
   ArrayPrint (arr); // 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9

}
//+------------------------------------------------------------------+

구조 필드에 대한 이러한 액세스를 사용하는 것이 매우 편리합니다. .... 함정이 있을 수 있는 위치 - 버그/오류?

 
Igor Makanu :

이 구조가 함수의 결과로 반환된 경우에도 구조의 필드에 액세스할 수 있다는 사실에 놀랐습니다.

이 코드는 올바르게 작동합니다(함수의 구조를 채운 다음 함수의 결과를 바이트 배열에 복사)

구조 필드에 대한 이러한 액세스를 사용하는 것이 매우 편리합니다. .... 함정이 있을 수 있는 위치 - 버그/오류?

이 유형의 칩)) 버그가 없습니다.

 ArrayCopy (arr, (f()).byte, ArraySize (arr))

그래서 오페라(.)(.)

나는 또한 바이트 배열에 복사하는 것과 관련이 있는지 이해하지 못했습니다. 즉시, 반환된 구조체의 데이터에 접근하기만 하면
 
Alexandr Andreev :
즉시, 반환된 구조체의 데이터에 접근하기만 하면

예, 하지만 f() 함수의 결과에 즉시 중간 변수 없이 바이트 필드에 액세스하는 것이 당황스럽습니다.

그래서 나는 이것에 대한 트릭을 기다리고 있습니다

f().byte
 
Igor Makanu :

예, 하지만 f() 함수의 결과에 즉시 중간 변수 없이 바이트 필드에 액세스하는 것이 당황스럽습니다.

그래서 나는 이것에 대한 트릭을 기다리고 있습니다

몇 년 동안 안정적

 
Alexandr Andreev :

몇 년 동안 안정적

알았어 고마워!