오류, 버그, 질문 - 페이지 2880

 
Igor Makanu :

아니요

반복되는 코드 섹션이 있는 경우 - 최적화 테스트를 받으십시오!

rand() 실행 시간은 어떤 차이가 있습니까?

예, 테스트 시간의 2/3를 실행합니다. 중요한 것은 rand()의 실행 시간이 일정하다는 것입니다.

IMHO, 시스템 기능을 실행하려면 컨텍스트를 전환해야 하지만 MQL 코드가 시스템 MQL 기능을 사용할까요? - 테스트할 이상적인 코드의 의미는?

)) 속도의 차이는 방법(1-4) 중 하나에 찬성하여 4배가 될 수 있지만, rand 연산은 나머지 코드보다 10배 더 길며 이 차이는 보이지 않습니다(11 ~ 14).

 
Alexandr Andreev :

)) 속도의 차이는 방법(1-4) 중 하나에 찬성하여 4배가 될 수 있지만, rand 연산은 나머지 코드보다 10배 더 길며 이 차이는 보이지 않습니다(11 ~ 14).

아니 못했어요

차이가 바로 보입니다

개발자가 혁신에서 발표 한 것을 확인합시다. 일부 기능의 시계열에 대한 액세스 시간이 최적화되었다고 종종 작성합니다 = 오랫동안 확인하지 않았습니다

 #define   SpeedTest(count_x10,msg,EX)        { ulong mss= GetMicrosecondCount (); ulong count=( ulong ) pow ( 10 ,count_x10); for ( ulong _i= 0 ;_i<count&&! _StopFlag ;_i++){EX;} \
//+------------------------------------------------------------------+
void OnStart ()
{
   double sum1 = 0.0 ;
   SpeedTest( 7 , "tst 1 : " ,
   {
      sum1 += iOpen ( NULL , 0 , rand ());
   });
//--
   double sum2 = 0.0 ;
   SpeedTest( 7 , "tst 2 : " ,
   {
       double o[];
       CopyOpen ( NULL , 0 , rand (), 1 , o);
      sum2 += o[ 0 ];
   });
   Print (sum1, " : " , sum2);
}
//+------------------------------------------------------------------+

2020.10.16 02:11:20.671 SpeedTst (EURUSD,H1) tst 1 : : 루프 = 10000000 ms = 353174

2020.10.16 02:11:21.967 SpeedTst (EURUSD,H1) tst2 : : 루프 = 10000000 ms = 1296043

2020.10.16 02:11:21.967 SpeedTst (EURUSD,H1) 11304533.15558525 : 11303930.69247558

2020.10.16 02:11:44.012 SpeedTst (EURUSD,H1) tst1 : : 루프 = 10000000 ms = 359757

2020.10.16 02:11:45.369 SpeedTst (EURUSD,H1) tst2 : : 루프 = 10000000 ms = 1357325

2020.10.16 02:11:45.369 SpeedTst (EURUSD,H1) 11304350.05612442 : 11304321.21848488

 
Igor Makanu :

일반적으로 무비판적인

rand()의 런타임은 일정합니다. 대부분의 경우 일반 C++ 함수인 Google "rand C++ 소스 코드"입니다.

초기화가 필요하지만 상수로 초기화하면 최적화에 빠질 수 있습니다.

일반적으로 rand()에 대한 혐오감은 분명하지 않습니다.

다음과 같이 초기화하는 옵션으로:

빠를 것이다


스크립트를 시작했습니다. IMHO가 올바르지 않습니다.

주요 시간은 코드를 캐시에 로드한 다음 프로세서에 로드하는 것입니다.

음, 시스템 타이머의 불연속성을 추가하십시오.

우리는 ... 거의 임의의 숫자를 얻습니다.

IMHO에 대해 약 100500 시간 동안 테스트해야합니다.

rand()는 결과를 시끄럽게 만듭니다.
내 컴퓨터에서 루프를 한 번 반복하는 데 약 1.5나노초가 걸립니다.

두 개의 rand()를 사용하면 한 번의 반복이 거의 3나노초까지 두 배로 늘어납니다. 동시에, 이러한 반복에서 큰 배열의 요소에 대한 액세스가 두 번 사라지고 비용이 많이 든다는 것을 이해해야 합니다.
따라서 총 반복 시간의 약 2/3가 두 개의 rand()에 사용된다고 가정할 수 있습니다. 물론 나는 "주문"에 흥분했습니다)))

이전에 준비한 배열이 난수로 채워지면 어떻게 최적화를 실행할 수 있는지 이해하지 못했습니다.

어떻게 든 그것은 rand()의 성능에 관한 것이었습니다. 비슷한 기능을 직접 작성해 보기도 했습니다. https://www.mql5.com/ru/forum/170952/page137#comment_12010041

 #define Num 10000000
#define SpeedTest(msg,s,EX)  { ulong mss= GetMicrosecondCount (); EX \
                                    mss= GetMicrosecondCount ()-mss;\
                                     printf ( "%-30s%llu µs; Сумма - %llu" ,msg,mss,s);}
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
{
   ulong sum = 0 ;
   ushort in[];
   ArrayResize (in,Num* 2 );
   for ( int i= 0 ; i<Num* 2 ; i++) in[i] = ( ushort ) rand ();
   SpeedTest( "test binary shift : " , sum,
   for ( int i = 0 ; i<( 2 *Num- 1 );i+= 2 )
   {
      sum+=in[i]<<( sizeof ( ushort )* 8 ) | in[i+ 1 ];
   });
//+------------------------------------------------------------------+ 
   sum = 0 ;
   union ushortTouint
   {
       uint param;
       ushort in[ 2 ];
   } u;
   SpeedTest( "test union : " , sum,
   for ( int i = 0 ; i<( 2 *Num- 1 );i+= 2 )
   {
      u.in[ 0 ]=in[i+ 1 ];
      u.in[ 1 ]=in[i];
      sum+=u.param;
   });
//+------------------------------------------------------------------+   
   sum= 0 ;
   SpeedTest( "test binary shift + rand() : " , sum,
   for ( int i = 0 ; i<( 2 *Num- 1 );i+= 2 )
   {
      sum+=( ushort ) rand ()<<( sizeof ( ushort )* 8 ) | ( ushort ) rand ();
   });
//+------------------------------------------------------------------+  
   sum = 0 ;
   SpeedTest( "test union + rand() : " , sum,
   for ( int i = 0 ; i<( 2 *Num- 1 );i+= 2 )
   {
      u.in[ 0 ]=( ushort ) rand ();
      u.in[ 1 ]=( ushort ) rand ();
      sum+=u.param;
   });
}

결과

 2020.10 . 15 18 : 30 : 34.752 TestMakanu (USDCAD,M1)  test binary shift :           13474 µs; Сумма - 10736778112806491
2020.10 . 15 18 : 30 : 34.763 TestMakanu (USDCAD,M1)  test union :                   10189 µs; Сумма - 10736778112806491
2020.10 . 15 18 : 30 : 34.792 TestMakanu (USDCAD,M1)  test binary shift + rand () :   29103 µs; Сумма - 10741215942967312
2020.10 . 15 18 : 30 : 34.820 TestMakanu (USDCAD,M1)  test union + rand () :         28125 µs; Сумма - 10737655794873175
2020.10 . 15 18 : 30 : 37.802 TestMakanu (USDCAD,M1)  test binary shift :           11144 µs; Сумма - 10739125609966082
2020.10 . 15 18 : 30 : 37.812 TestMakanu (USDCAD,M1)  test union :                   10334 µs; Сумма - 10739125609966082
2020.10 . 15 18 : 30 : 37.840 TestMakanu (USDCAD,M1)  test binary shift + rand () :   27495 µs; Сумма - 10739749025492645
2020.10 . 15 18 : 30 : 37.867 TestMakanu (USDCAD,M1)  test union + rand () :         26782 µs; Сумма - 10738717766184542
2020.10 . 15 18 : 30 : 40.356 TestMakanu (USDCAD,M1)  test binary shift :           10618 µs; Сумма - 10738510882058397
2020.10 . 15 18 : 30 : 40.367 TestMakanu (USDCAD,M1)  test union :                   11354 µs; Сумма - 10738510882058397
2020.10 . 15 18 : 30 : 40.395 TestMakanu (USDCAD,M1)  test binary shift + rand () :   27637 µs; Сумма - 10738670876702722
2020.10 . 15 18 : 30 : 40.422 TestMakanu (USDCAD,M1)  test union + rand () :         26772 µs; Сумма - 10737441784096963
 

결과는 유니온 또는 이진 시프트를 통해 무엇을 사용할지 거의 차이가 없다는 것입니다.
iCanvas 라이브러리에서 이 두 가지 방법을 모두 사용하여 색상 작업을 합니다.

 union argb {
   uint clr;
   uchar c[ 4 ];
};


저도 오랜만에 성능 테스트를 해보니 거의 차이가 없다는 결론에 이르렀던 기억이 납니다. 그러나 Union이 있는 코드는 더 읽기 쉽습니다.
솔직히 이것은 나를 실망시켰습니다. 왜냐하면. 나는 노동조합을 통해 눈에 띄는 성과를 얻을 것으로 기대했다.

 
Nikolai Semko :

이전에 준비한 배열이 난수로 채워지면 어떻게 최적화를 실행할 수 있는지 이해하지 못했습니다.

habr에 대한 위의 2개 링크는 첫 번째 기사에서 컴파일 후 일반 루프가 어떻게 보이는지 잘 보여줍니다.

실행 최적화에 확실히 도달할 수 있다는 말은 아니지만 IMHO, 배열이 변경되지 않으면 본질적으로 주기에 대해 일정한 크기를 갖는 일정한 메모리 영역이므로 최적화가 실행되지 않는다는 것은 아닙니다. 일부 유형의 프로세서에서는 컴파일러와 캐시가 있는 프로세서 모두에서 최적화를 기대할 수 있습니다.


니콜라이 셈코 :

결과는 유니온 또는 이진 시프트를 통해 무엇을 사용할지 거의 차이가 없다는 것입니다.

예, 시프트를 사용할 것이며 코드를 읽을 수 있으며 새로운 데이터 유형인 공용체를 도입할 필요가 없습니다.
 
Igor Makanu :

habr에 대한 위의 2개 링크는 첫 번째 기사에서 컴파일 후 일반 루프가 어떻게 보이는지 잘 보여줍니다.

실행 최적화에 확실히 도달할 수 있다는 말은 아니지만 IMHO, 배열이 변경되지 않으면 본질적으로 주기에 대해 일정한 크기를 갖는 일정한 메모리 영역이므로 최적화가 실행되지 않는다는 것은 아닙니다. 위로

결과로 보아 최적화의 냄새가 없다

 
Nikolai Semko :

결과로 보아 최적화의 냄새가 없다

분쟁이 특정 코드에 있지 않습니다.

테스트 방법론 자체에서 나는 여전히 최적으로 테스트한다는 사실을 고수하며 rand()가 왜곡을 도입하지만 비례 계수가 아닌 선형 계수입니다. 5% 미만의 속도 차이가 없으면 정확도는 기본적으로 그다지 중요하지 않습니다. IMHO

 
친애하는, 글쎄, 적어도 누군가 는 내가 이해할 수없는 상황 에 대해 대답 할 수 있습니까?
 

안녕하세요!

MQL5 개발자에게 질문이 있습니까? 다른 사람이 알고 있을 수도 있습니다... ME 컴파일러/코드 편집기를 IDEA 또는 Visual Studio 와 같은 인기 있는 개발 환경과 통합할 계획입니까? 저에게 Meta Editor는 큰 고통입니다. 블록 접기, 템플릿 자동 대체가 없습니다(입력을 시작하는 것처럼(... 그리고 그는 즉시 대체할 주기 템플릿을 제공함 등). 그리고 일반의 중요한 부분을 강조 표시하지 않습니다. 현대 로봇이 복잡하고 대규모 프로젝트이며 코드 관리 및 공동 개발 가능성에 대한 요구 사항이 훨씬 더 많다는 사실에 대해 이야기하는 것이 아닙니다.

아무도 편집기와 컴파일러를 더 이상 작성하지 않으며 모두가 이를 거부하고 Microsoft, JetBrains 등의 기성 솔루션으로 전환합니다. 모든 최신 편집기에는 원하는 모든 것을 끼워 넣을 수 있는 사용자 정의 플러그인 시스템이 있습니다. 작업은 원칙적으로 어렵지 않습니다.

 
Сергей Таболин :
친애하는, 글쎄, 적어도 누군가 는 내가 이해할 수없는 상황 에 대해 대답 할 수 있습니까?

그리고 당신은 프로그래머보다 훨씬 더 뒤에 있습니다. 그러면 그들은 확실히 도움이 될 것입니다.