전문가를 위한 질문 #define - 페이지 8

 
void OnStart ()
  {
   int mas[];
   int mas1[ 300 ];
   int mas2[ 300 ];
   int mas3[ 300 ];
   int mas4[ 300 ];
   int mas5[ 300 ];
   int mas6[ 300 ];
   int z= 300 ;
   int size= 100000000 ;
   ArrayResize (mas,size);
   ulong r= 0 ;
   ulong r1= 0 ;
   ulong r2= 0 ;
   int random;
   ulong max= 100 ; 
   int t= 0 ;
   int tr= 0 ; 
   MathSrand ( 10 );
     int num_steps= ArraySize (mas);
     double x, pi, sum= 0.0 ;
     double step = 1.0 /( double )num_steps;
    
     int v=size;
     ulong t1 = GetMicrosecondCount ();
     
    
   // for(ulong z=0; z<max; z++)
     {
       for ( ulong i= 0 ; i< ArraySize (mas); i++)
        { 
        r2+= ArraySize (mas);
        r2+= ArraySize (mas1);
        r2+= ArraySize (mas2);
        r2+= ArraySize (mas3);
        r2+= ArraySize (mas4);
        r2+= ArraySize (mas5);
        r2+= ArraySize (mas6);
        r2+= ArraySize (mas1);
        r2+= ArraySize (mas2);
        r2+= ArraySize (mas3);
        r2+= ArraySize (mas4);
        r2+= ArraySize (mas5);
        r2+= ArraySize (mas6);
        r2+= ArraySize (mas1);
        r2=r2/ 10 ;
        }

     }  
   ulong t2= GetMicrosecondCount ();
   //for(ulong z=0; z<max; z++)
     {
       for ( ulong i= 0 ; i<v; i++)
        { 
        r1+=v;
        r1=r1/ 10 ;
        }
     }
   
   int pi2 = sum*step;
   ulong t3= GetMicrosecondCount ();
   Print (t2-t1, "  " ,t3-t2, " " ,r, " " ,r1, " " ,r2, " " ,pi, " " ,pi2);
// Templ();
  }

그럼에도 불구하고 상위 코드가 승리하지만 매우 드물게 발생합니다. 링크를 클릭하십시오 - 무료로 간주하십시오

 
Alexandr Andreev :

) 글쎄, 그것은 그렇게 작동하지 않습니다)


이것이 C++에서 작동하는 방식입니다.
mql에서는 동일하다고 생각하지만 MQ의 추가 래퍼가 있습니다.


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

초보자의 질문 MQL5 MT5 MetaTrader 5

로만 , 2019.12.11 14:02

물론 컴파일러가 모든 것을 스스로 수행하는 이유에 대해 생각할 필요는 없습니다. ))
C가 아닌 C#

__inline의 경우 비디오를 참조하십시오.
차이점이 없는 사람들을 위해 메모리의 기능이 어떻게 작동하는지 설명합니다.


 
Roman :

이것이 C++에서 작동하는 방식입니다.
mql에서는 동일하다고 생각하지만 MQ의 추가 래퍼가 있습니다.

글쎄, 이제 우리는 이 스레드와 많은 문장과 테스트 예제를 다시 읽었습니다. 약간의 차이가 있습니다. 그리고 결국 발견))))

 
Alexandr Andreev :

글쎄, 이제 우리는 이 스레드와 많은 문장과 테스트 예제를 다시 읽었습니다. 약간의 차이가 있습니다. 그리고 결국 발견))))

아니오)) 다시 읽고 싶은 생각이 없습니다.
차이가 있다는 것은 분명합니다.

 
Roman :

아니오)) 다시 읽고 싶은 생각이 없습니다.
차이가 있다는 것은 분명합니다.

))) 다른 IMHO

 
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart ()
  {
   int mas[];
   int mas1[ 300 ];
   int mas2[ 300 ];
   int mas3[ 300 ];
   int mas4[ 300 ];
   int mas5[ 300 ];
   int mas6[ 300 ];
   int z= 300 ;
   int size= 1000000000 ;
   ArrayResize (mas,size);
   ulong r= 0 ;
   ulong r1= 0 ;
   ulong r2= 0 ;
   int random;
   ulong max= 100 ; 
   int t= 0 ;
   int tr= 0 ; 
   MathSrand ( 10 );
     int num_steps= ArraySize (mas);
     double x, pi, sum= 0.0 ;
     double step = 1.0 /( double )num_steps;
    
     int v=size;
     ulong t1 = GetMicrosecondCount ();
     
    
   // for(ulong z=0; z<max; z++)
     {
       for ( int i= 0 ; i< ArraySize (mas); i++)
        { 
        r2+= ArraySize (mas);
        r2+= ArraySize (mas1);
        r2+= ArraySize (mas2);
        r2+= ArraySize (mas3);
        r2+= ArraySize (mas4);
        r2+= ArraySize (mas5);
        r2+= ArraySize (mas6);
        r2+= ArraySize (mas1);
        r2+= ArraySize (mas2);
        r2+= ArraySize (mas3);
        r2+= ArraySize (mas4);
        r2+= ArraySize (mas5);
        r2+= ArraySize (mas6);
        r2+= ArraySize (mas1);
        r2+= ArraySize (mas);
        r2+= ArraySize (mas1);
        r2+= ArraySize (mas2);
        r2+= ArraySize (mas3);
        r2+= ArraySize (mas4);
        r2+= ArraySize (mas5);
        r2+= ArraySize (mas6);
        r2+= ArraySize (mas1);
        r2+= ArraySize (mas2);
        r2+= ArraySize (mas3);
        r2+= ArraySize (mas4);
        r2+= ArraySize (mas5);
        r2+= ArraySize (mas6);
        r2+= ArraySize (mas1);
        r2+= ArraySize (mas);
        r2+= ArraySize (mas1);
        r2+= ArraySize (mas2);
        r2+= ArraySize (mas3);
        r2+= ArraySize (mas4);
        r2+= ArraySize (mas5);
        r2+= ArraySize (mas6);
        r2+= ArraySize (mas1);
        r2+= ArraySize (mas2);
        r2+= ArraySize (mas3);
        r2+= ArraySize (mas4);
        r2+= ArraySize (mas5);
        r2+= ArraySize (mas6);
        r2+= ArraySize (mas1);
        r2+= ArraySize (mas1);
        r2+= ArraySize (mas2);
        r2+= ArraySize (mas3);
        r2+= ArraySize (mas4);
        r2+= ArraySize (mas5);
        r2+= ArraySize (mas6);
        r2+= ArraySize (mas1);
        r2+= ArraySize (mas2);
        r2+= ArraySize (mas3);
        r2+= ArraySize (mas4);
        r2+= ArraySize (mas5);
        r2+= ArraySize (mas6);
        r2+= ArraySize (mas1);
        r2+= ArraySize (mas);
        r2+= ArraySize (mas1);
        r2+= ArraySize (mas2);
        r2+= ArraySize (mas3);
        r2+= ArraySize (mas4);
        r2+= ArraySize (mas5);
        r2+= ArraySize (mas6);
        r2+= ArraySize (mas1);
        r2+= ArraySize (mas2);
        r2+= ArraySize (mas3);
        r2+= ArraySize (mas4);
        r2+= ArraySize (mas5);
        r2+= ArraySize (mas6);
        r2+= ArraySize (mas1);
        r2+= ArraySize (mas);
        r2+= ArraySize (mas1);
        r2+= ArraySize (mas2);
        r2+= ArraySize (mas3);
        r2+= ArraySize (mas4);
        r2+= ArraySize (mas5);
        r2+= ArraySize (mas6);
        r2+= ArraySize (mas1);
        r2+= ArraySize (mas2);
        r2+= ArraySize (mas3);
        r2+= ArraySize (mas4);
        r2+= ArraySize (mas5);
        r2+= ArraySize (mas6);
        r2+= ArraySize (mas1);
        r2+= ArraySize (mas1);
        r2+= ArraySize (mas2);
        r2+= ArraySize (mas3);
        r2+= ArraySize (mas4);
        r2+= ArraySize (mas5);
        r2+= ArraySize (mas6);
        r2+= ArraySize (mas1);
        r2+= ArraySize (mas2);
        r2+= ArraySize (mas3);
        r2+= ArraySize (mas4);
        r2+= ArraySize (mas5);
        r2+= ArraySize (mas6);
        r2+= ArraySize (mas1);
        r2+= ArraySize (mas);
        r2+= ArraySize (mas1);
        r2+= ArraySize (mas2);
        r2+= ArraySize (mas3);
        r2+= ArraySize (mas4);
        r2+= ArraySize (mas5);
        r2+= ArraySize (mas6);
        r2+= ArraySize (mas1);
        r2+= ArraySize (mas2);
        r2+= ArraySize (mas3);
        r2+= ArraySize (mas4);
        r2+= ArraySize (mas5);
        r2+= ArraySize (mas6);
        r2+= ArraySize (mas1);
        r2+= ArraySize (mas);
        r2+= ArraySize (mas1);
        r2+= ArraySize (mas2);
        r2+= ArraySize (mas3);
        r2+= ArraySize (mas4);
        r2+= ArraySize (mas5);
        r2+= ArraySize (mas6);
        r2+= ArraySize (mas1);
        r2+= ArraySize (mas2);
        r2+= ArraySize (mas3);
        r2+= ArraySize (mas4);
        r2+= ArraySize (mas5);
        r2+= ArraySize (mas6);
        r2+= ArraySize (mas1);
        r2+= ArraySize (mas1);
        r2+= ArraySize (mas2);
        r2+= ArraySize (mas3);
        r2+= ArraySize (mas4);
        r2+= ArraySize (mas5);
        r2+= ArraySize (mas6);
        r2+= ArraySize (mas1);
        r2+= ArraySize (mas2);
        r2+= ArraySize (mas3);
        r2+= ArraySize (mas4);
        r2+= ArraySize (mas5);
        r2+= ArraySize (mas6);
        r2+= ArraySize (mas1);
        r2+= ArraySize (mas);
        r2+= ArraySize (mas1);
        r2+= ArraySize (mas2);
        r2+= ArraySize (mas3);
        r2+= ArraySize (mas4);
        r2+= ArraySize (mas5);
        r2+= ArraySize (mas6);
        r2+= ArraySize (mas1);
        r2+= ArraySize (mas2);
        r2+= ArraySize (mas3);
        r2+= ArraySize (mas4);
        r2+= ArraySize (mas5);
        r2+= ArraySize (mas6);
        r2+= ArraySize (mas1);
        r2+= ArraySize (mas);
        r2+= ArraySize (mas1);
        r2+= ArraySize (mas2);
        r2+= ArraySize (mas3);
        r2+= ArraySize (mas4);
        r2+= ArraySize (mas5);
        r2+= ArraySize (mas6);
        r2+= ArraySize (mas1);
        r2+= ArraySize (mas2);
        r2+= ArraySize (mas3);
        r2+= ArraySize (mas4);
        r2+= ArraySize (mas5);
        r2+= ArraySize (mas6);
        r2+= ArraySize (mas1); 
        r2++;
        r2=r2/ 100 ;
        }

     }  
   ulong t2= GetMicrosecondCount ();
   //for(ulong z=0; z<max; z++)
   int sizem= ArraySize (mas);
     {
       for ( int i= 0 ; i<sizem; i++)
        { 
        r1++;
        r1=r1/ 100 ;
        r1++;
        
        }
     }
    
   ulong t3= GetMicrosecondCount ();
   Print (t2-t1, "  " ,t3-t2, " " ,r2, " " ,r1);
// Templ();
  }

//+------------------------------------------------------------------+
//|                                           
  
void Funk( ulong &a){a++;}
void FunkRand( ulong &a){a+= rand ();}

//+------------------------------------------------------------------+

위의 방법은 거의 15% 더 빠릅니다. 모든 것이 너무 명확하기 때문에 이것은 매우 중요합니다.


 
Alexandr Andreev :

))) 다른 IMHO

위의 방법은 거의 20 % 더 빠릅니다. 모든 것이 너무 분명하기 때문에 설명하십시오)


비교된 주기는 본문의 코드에서 동일하지 않습니다.
본문의 첫 번째 루프에는 하나의 코드가 있고 루프의 두 번째 본문에는 다른 코드가 있습니다.
자연스럽게 다른 코드 명령어, 자연스럽게 다른 실행 시간.
루프 본문에 동일한 코드를 만들고 ArraySize 루프 조건과 크기 변수만 변경합니다.
우리는 몸이 아니라 이 부분을 시험하고 있습니다.

 
Roman :

비교된 주기는 본문의 코드에서 동일하지 않습니다.
첫 번째 루프에는 본문에 하나의 코드가 있고 두 번째 루프에는 다른 코드가 있습니다.
자연스럽게 다른 코드 명령어, 자연스럽게 다른 실행 시간.
루프 본문에 동일한 코드를 만들고 ArraySize 루프 조건과 크기 변수만 변경합니다.
우리는 몸이 아니라 이 부분을 시험하고 있습니다.

귀하의 테스트는 더 이상 정확하지 않습니다. 실행 사례에 따라 다르지만 다시 실행하십시오. 여기 두 경우 모두 증분과 1 분할이 있습니다. 음, + 상단에는 여전히 수십 ~ 수십억 개의 ArraySize 호출 이 추가로 있습니다.

그건 그렇고, 우리가 시험하는 것을 기록해야 하는 것은 몸에 있습니다. 왜냐하면 반복하는 몸이다. 우리는 결과를 얻기 위해 그것을 루프로 감싸려고 시도합니다 .... 즉, 원래 본문에서 ArraySize를 호출 해야 했습니다.

Документация по MQL5: Операции с массивами / ArraySize
Документация по MQL5: Операции с массивами / ArraySize
  • www.mql5.com
"Нулевое измерение = Размер массива / (Первое измерение * Второе измерение * Третье измерение)"
 
Alexandr Andreev :

귀하의 테스트는 더 이상 정확하지 않습니다. 실행 사례에 따라 다르지만 다시 실행하십시오. 여기 두 경우 모두 증분과 1 분할이 있습니다. 음, + 상단에는 여전히 수십 ~ 수십억 개의 ArraySize 호출 이 추가로 있습니다.

그건 그렇고, 우리가 시험하는 것을 기록해야 하는 것은 몸에 있습니다. 왜냐하면 반복하는 몸이다. 우리는 결과를 얻기 위해 루프로 랩핑하려고 시도합니다 .... 즉, 원래 본문에서 ArraySize를 호출 해야 했습니다.

반복할 때마다 루프 조건에서 i<ArraySize() 또는 i<size 조건이 어쨌든 검사됩니다.
즉, 각 반복마다 함수 또는 변수에 대한 호출이 있습니다.
테스트 대상을 배치하는 신체의 경우는 어떻습니까?

여기서 논리 자체는 무엇이 더 빨리 해결될 것인지를 제안합니다. 함수나 변수에.
컴파일러가 거기에 어떻게 인라인되는지는 상관하지 않습니다. 나는 컴파일러에 의존하지 않고 상식에 의존하고 있습니다. 이는 반전 측면에서 처리하는 것이 더 빠릅니다.

 
Roman :

반복할 때마다 루프 조건에서 i<ArraySize() 또는 i<size 조건이 어쨌든 검사됩니다.
즉, 각 반복에서 함수 또는 변수에 액세스합니다.
테스트 대상을 배치할 신체의 경우는 어떻습니까?

이 함수는 운이 좋기 때문에 다른 함수가 될 수 있습니다. 그리고 그들은 그것을 몸에 넣었습니다. 그리고 효과를 높이고 다른 배열을 참조하려고만 복제했다는 사실.

그러나 더 복잡한 작업을 추가하는 것은 잘못된 것이며, 계산 오류가 연구 중인 효과를 가릴 수 있습니다. 그건 그렇고, 어셈블리가 μl처럼 일정하지 않을 수도 있습니다. 저것들. 재컴파일할 때 약간 다른 데이터를 얻을 수 있습니다(정확하지는 않지만 해킹에 대한 보호 수단으로 사용합니다). 따라서 코드에서 모든 것을 테스트할 수도 있습니다. 당신은보고 결과가 변경됩니다.

Mkl은 비디오에 표시된 대로 코드를 대체하려고 합니다. 글쎄요, 거기는 조금 다릅니다. 그러나 일반적으로.

그리고 어떤 값을 받을지 모르는 함수에 대한 지침 - 이것이 js 및 php 및 기타 유사한 언어가 작동하는 방식입니다. 심지어 µl도 이런 방식으로 작동하지만 디버그 모드 에서만 작동합니다.

Документация по MQL5: Константы, перечисления и структуры / Состояние окружения / Информация о запущенной MQL5-программе
Документация по MQL5: Константы, перечисления и структуры / Состояние окружения / Информация о запущенной MQL5-программе
  • www.mql5.com
Информация о запущенной MQL5-программе - Состояние окружения - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Roman :

반복할 때마다 루프 조건에서 i<ArraySize() 또는 i<size 조건이 어쨌든 검사됩니다.
즉, 각 반복에서 함수 또는 변수에 액세스합니다.
테스트 대상을 배치하는 신체의 경우는 어떻습니까?

여기서 논리 자체는 무엇이 더 빨리 해결될 것인지를 제안합니다. 함수나 변수에.
컴파일러가 거기에 어떻게 인라인되는지는 상관하지 않습니다. 나는 컴파일러에 의존하지 않고 상식에 의존하고 있습니다. 이는 반전 측면에서 처리하는 것이 더 빠릅니다.

항상 작동하는 것은 아닙니다.

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

전문가를 위한 질문 #define

로만 , 2020.11.02 19:44

내 게시물을 변경했습니다.
반대로 ArraySize는 이제 cnt 변수보다 빠르게 수행됩니다.
이전에는 그 반대였습니다. 아마도 증분 cnt-- 영향을 미치고 주기의 본체가 다르며 아마도 로드에 대해 다른 것이 발명되어야 할 것입니다.

 void OnStart ()
{
   int arr[];
   int sz = ArrayResize (arr, 100000000 );  
   
   ulong t = GetMicrosecondCount ();
   
   for ( int i= 0 ; i < ArraySize (arr) ; i++) 
   {
       ArrayResize (arr, sz--); //какая то нагрузка
   }   
   
   t = GetMicrosecondCount () - t;
   
   PrintFormat ( "Total time: %.3f ms" , t / 1000.0 );
}
 2020.11 . 02 21 : 33 : 22.863 TestScript (USDJPY,M1)  Total time: 451.200 ms


 void OnStart ()
{
   int arr[];
   int sz = ArrayResize (arr, 100000000 );  
   int cnt = ArraySize (arr);
   
   ulong t = GetMicrosecondCount ();
   
   for ( int i= 0 ; i < cnt ; i++) 
   {
       ArrayResize (arr, sz--);
      cnt--;
   }
      
   t = GetMicrosecondCount () - t;
   
   PrintFormat ( "Total time: %.3f ms" , t / 1000.0 );
}
 2020.11 . 02 21 : 56 : 26.591 TestScript (USDJPY,M1)  Total time: 531.872 ms