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

 
Alexandr Andreev :

당신은 당신의 가치가 될 당신의 코드에서 아무 것도 섞지 않았습니다.

첫 번째 옵션에서 발생하는 대로 변경

예, 나는 그것을 놓쳤습니다. 내 게시물을 수정했습니다.

 
Valeriy Yastremskiy :

무작위 결과입니다. 컴파일할 때 배열 크기 값이 있는 메모리 셀에 대한 액세스가 배포되고 배열이 형성될 때 배열이 동적이고 배열 크기와 변수 값은 액세스 시간이 동일합니다.

글쎄, 컴퓨터 과학의 3-4 과정에서 컴파일러가하는 일이라는 문구로 판단하면 ... 일반적으로 충분히 필요한 수준의 인력이 MCL 환경에서 매우 긴장하지 않기를 바랍니다.

저를 믿으세요. 평균적인 학생은 일반적으로 FIVT입니다. 플러스는 0입니다. 왜냐하면. 경험은 0이고 경험이 없는 지식은 빠르게 아무데도 가지 않고(잊혀짐), 그들의 예는 매우 이상합니다. 학생이 어디에서 어떻게 사용할 수 있는지 이해하려면 몇 년이 지나야 합니다. 이것은 숙련된 프로그래머와 비교할 때입니다.

 
Alexandr Andreev :

저를 믿으세요. 평균적인 학생은 보통 FIVT입니다. 플러스는 0입니다. 왜냐하면. 경험은 0이고 경험이 없는 지식은 빠르게 아무데도 가지 않으며(잊혀짐), 그들의 예는 매우 이상합니다. 학생이 어디에서 어떻게 사용할 수 있는지 이해하려면 몇 년이 지나야 합니다. 이것은 숙련된 프로그래머와 비교할 때입니다.

이것은 분명합니다. 컴파일러를 만드는 방법을 배우는 이유는 명확하지 않습니다. 자신의 언어를 만드는 방법을 가르치는 것과 같습니다. 언어가 클래스라는 것은 분명하지만 모든 새가 선험적으로 날 수 있는 것은 아닙니다. 음, 위에서 언급했듯이 오류, 버그, 질문은 이동 중에 컴파일을 최적화하는 문제와도 관련이 있습니다.

 

주제는 일반적으로 사이클이 아닌 정의에 관한 것입니다))

예를 들어 사용자 정의 함수와 같은 코드를 정의하는 것이 의미가 있는지 여부는 여전히 나에게 명확하지 않습니다.
코드가 실행 파일에서 더 빨리 실행되기를 바랍니다.
아니면 망상입니까? 대체는 컴파일 전 작업일 뿐이고 어셈블리 속도를 높이는 것만이 논리적이기 때문입니다.

 
Roman :

주제는 일반적으로 사이클이 아닌 정의에 관한 것입니다))

예를 들어 사용자 정의 함수와 같은 코드를 정의하는 것이 의미가 있는지 여부는 여전히 나에게 명확하지 않습니다.
코드가 실행 파일에서 더 빨리 실행되기를 바랍니다.
아니면 망상입니까? 대체는 컴파일 전 작업일 뿐이고 어셈블리 속도를 높이는 것만이 논리적이기 때문입니다.

확장된 형식에 대해 3개의 외부 기능 이 사용되는 예를 던졌습니다. 저것들. 가속이 없을 것이다

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

전문가를 위한 질문 #define

Alexander Andreev , 2020.11.02 19:49

 void OnStart ()
  {
   int mas[];
   int size= 1000000 ;
   ArrayResize (mas,size);
   ulong r= 0 ;
   ulong r1= 0 ;
   ulong r2= 0 ;
   int random;
   ulong max= 100 ;
   uint t1= GetTickCount ();
   int t= 0 ;
   int tr= 0 ; 
   MathSrand ( 10 );
   for ( ulong z= 0 ; z<max; z++)
     {
       for ( ulong i= 0 ; i< ArraySize (mas); Funk(i))
        { 
         FunkRand(r1); 
         Funk(r); // мы сюда написали вызов еще одной функции чтобы усложить ситуацию
        }
     }
   tr=r;
   uint t2= GetTickCount ();
   for ( ulong z= 0 ; z<max; z++)
     {
     int v=size;
       for ( ulong i= 0 ; i<v; i++)
        { 
         r2+= rand ();
         r--;
        }

     }

   uint t3= GetTickCount ();
   Print (t2-t1, "  " ,t3-t2, " " ,r, " " ,r1, " " ,r2, " " ,t1, " " ,tr);
// Templ();
  }

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

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

어떤 방법이 더 빠른지 500r(검증 없음)에 대한 질문입니다. 상위 메소드에서 얼마나 많은 외부 함수가 호출되는지 확인


Документация по MQL5: Основы языка / Функции / Описание внешних функций
Документация по MQL5: Основы языка / Функции / Описание внешних функций
  • www.mql5.com
Внешние функции, определенные в другом модуле, должны быть явно описаны. Описание включает в себя тип возвращаемого значения, имя функции и набор входных параметров с их типами. Отсутствие такого описания может привести к ошибкам при компиляции, компоновке или выполнении программы. При описании внешнего объекта используйте ключевое слово С...
 
Alexandr Andreev :

확장된 형식에 대해 3개의 외부 기능 이 사용되는 예를 던졌습니다. 저것들. 가속이 없을 것이다


분명한. 그럼 안녕 fxsaber. 모든 것을 정의하는 팬.


알렉산드르 안드레예프 :

그렇지 않으면 나를 증명해

그런 다음 내 테스트에서 어떤 이유로 든 동일합니다.

ArraySize() 및 변수의 경우. 어쨌든 이 문제로 돌아갑니다.
다음은 내가 변경한 테스트입니다. 루프는 숫자 PI를 계산합니다.
첫 번째 예에서 ArraySize()는 루프 조건에서 사용됩니다.
두 번째 예에서는 num_steps 변수가 사용됩니다.
차이가 있습니다.

ArraySize() 함수

 void OnStart ()
{
     int arr[];
     int num_steps = ArrayResize (arr, 1000000000 );

     double x, pi, sum= 0.0 ;
     double step = 1.0 /( double )num_steps;
    
     ulong t = GetMicrosecondCount ();
    
     for ( int i = 0 ; i< ArraySize (arr) ; i++)
    {
       x = (i + . 5 ) * step;
       sum = sum + 4.0 / ( 1.0 + x * x);
    }
    
    pi = sum*step;
        
    t = GetMicrosecondCount () - t;
   
   printf ( "The value of PI is %1.12f " , pi);
   PrintFormat ( "Total time to calculate PI was %5.3f ms\n" , t / 1000.0 );
}

세 개의 스크립트가 실행됩니다.

 2020.11 . 02 23 : 56 : 51.556 TestScript (USDJPY,M1)  The value of PI is 3.141592653590 
2020.11 . 02 23 : 56 : 51.556 TestScript (USDJPY,M1)  Total time to calculate PI was 4049.179 ms
2020.11 . 02 23 : 56 : 51.556 TestScript (USDJPY,M1)  
2020.11 . 02 23 : 56 : 57.928 TestScript (USDJPY,M1)  The value of PI is 3.141592653590 
2020.11 . 02 23 : 56 : 57.928 TestScript (USDJPY,M1)  Total time to calculate PI was 4183.364 ms
2020.11 . 02 23 : 56 : 57.928 TestScript (USDJPY,M1)  
2020.11 . 02 23 : 57 : 03.884 TestScript (USDJPY,M1)  The value of PI is 3.141592653590 
2020.11 . 02 23 : 57 : 03.884 TestScript (USDJPY,M1)  Total time to calculate PI was 4034.098 ms
        


변수 num_steps

 void OnStart ()
{
     int arr[];
     int num_steps = ArrayResize (arr, 1000000000 );

     double x, pi, sum= 0.0 ;
     double step = 1.0 /( double )num_steps;
    
     ulong t = GetMicrosecondCount ();
    
     for ( int i = 0 ; i< num_steps ; i++)
    {
        x = (i + . 5 ) * step;
        sum = sum + 4.0 / ( 1.0 + x * x);
    }
    
    pi = sum*step;
        
    t = GetMicrosecondCount () - t;
   
   printf ( "The value of PI is %1.12f " , pi);
   PrintFormat ( "Total time to calculate PI was %5.3f ms\n" , t / 1000.0 );
}

세 개의 스크립트가 실행됩니다.

 2020.11 . 03 00 : 08 : 09.269 TestScript (USDJPY,M1)  The value of PI is 3.141592653590 
2020.11 . 03 00 : 08 : 09.271 TestScript (USDJPY,M1)  Total time to calculate PI was 3955.325 ms
2020.11 . 03 00 : 08 : 09.271 TestScript (USDJPY,M1)  
2020.11 . 03 00 : 08 : 15.578 TestScript (USDJPY,M1)  The value of PI is 3.141592653590 
2020.11 . 03 00 : 08 : 15.578 TestScript (USDJPY,M1)  Total time to calculate PI was 3950.568 ms
2020.11 . 03 00 : 08 : 15.578 TestScript (USDJPY,M1)  
2020.11 . 03 00 : 08 : 22.469 TestScript (USDJPY,M1)  The value of PI is 3.141592653590 
2020.11 . 03 00 : 08 : 22.469 TestScript (USDJPY,M1)  Total time to calculate PI was 3927.110 ms
        
 
Roman :

분명한. 그럼 안녕 fxsaber. 모든 것을 정의하는 팬.

ArraySize() 및 변수의 경우. 어쨌든 이 문제로 돌아갑니다.
다음은 내가 변경한 테스트입니다. 루프는 숫자 PI를 계산합니다.
첫 번째 예에서 ArraySize()는 루프 조건에서 사용됩니다.
두 번째 예에서는 num_steps 변수가
사용됩니다.
차이가 있습니다.

ArraySize() 함수

세 개의 스크립트가 실행됩니다.


변수 num_steps

세 개의 스크립트가 실행됩니다.

그러한 계산에는 명확한 차이가 없습니다. 모든 것을 하나의 코드에 넣었고 결과가 다르며 첫 번째 옵션이 이기는 곳이 있습니다.

)) µl의 모든 배열에는 대부분의 언어에서와 같이 배열의 현재 크기를 담당하는 변수가 있습니다.

ArraySize 함수 는 컴파일러에게 이 변수의 값을 반환하도록 지시합니다. 이 함수 대신 이 변수를 직접 대체합니다. 마이크로리터의 배열은 참조와 같을 수 없습니다. 그러면 포인터는 이 변수에 대해 명시적으로 메모리의 크로케 주소에 직접적으로 지정됩니다. 기술적으로 이러한 모든 테스트는 두 개의 공통 변수를 비교하려는 시도입니다. 이것은 확장 기능의 속성입니다. 제 예에서 4개의 기능은 0개의 기능을 허용하고 그 중 3개는 주기의 본문에 직접 위치합니다. 40000000000 함수 호출과 아무 것도 비교하지 않습니다. 그리고 우리는 알아차리기에는 너무 작은 암묵적인 차이를 봅니다. 왜냐하면 - 때문입니다. 실행 파일에 코드를 넣는 중입니다. 같은 것을 비교하고 있습니다.

이 모든 계산은 복잡할수록 의미가 줄어듭니다.

한 경우에는 수백 개의 함수가 호출되고, 함수 내의 함수는... 그리고 다른 경우에는 이 모든 것이 확장된 형식으로 된 예를 제공하는 것이 더 쉬우며 차이가 없을 것입니다. 티, 케이. ArraySize(mas)==mas[]. 크기

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

어떤 이유에서인지 파이가있는 예가 있지만 여전히 차이가 있습니다 ..... 과체중 빈도 측면에서 (에디션) 이것은 여전히 순전히 무작위 과체중이지만

변수와 변수를 명시적으로 비교하려고 시도하지 않았음에도 불구하고 10억 수출당 1ms와 동일하므로 스프레드가 훨씬 더 커짐))


 
Alexandr Andreev :

그러한 계산에는 명확한 차이가 없습니다. 하나의 코드에 모두 넣었더니 결과가 다르고 첫 번째 옵션이 이기는 곳이 있습니다.

)) µl의 모든 배열에는 대부분의 언어에서와 같이 배열의 현재 크기를 담당하는 변수가 있습니다.

ArraySize 함수 는 컴파일러에게 이 변수의 값을 반환하도록 지시합니다. 이 함수 대신 이 변수를 직접 대체합니다. 마이크로리터의 배열은 참조와 같을 수 없습니다. 그러면 포인터는 이 변수에 대해 명시적으로 메모리의 크로케 주소에 직접적으로 지정됩니다. 기술적으로 이러한 모든 테스트는 두 개의 공통 변수를 비교하려는 시도입니다. 이것은 확장 기능의 속성입니다. 제 예에서 4개의 기능은 0개의 기능을 허용하고 그 중 3개는 주기의 본문에 직접 위치합니다. 40000000000 함수 호출과 아무 것도 비교하지 않습니다. 그리고 우리는 알아차리기에는 너무 작은 암묵적인 차이를 봅니다. 왜냐하면 - 때문입니다. 그것은 실행 파일에 코드를 넣는 것입니다.... 우리는 같은 것을 비교하고 있습니다.

이 모든 계산은 복잡할수록 의미가 줄어듭니다.

한 경우에는 수백 개의 함수가 호출되고, 함수 내의 함수는... 그리고 다른 경우에는 이 모든 것이 확장된 형식으로 된 예를 제공하는 것이 더 쉬우며 차이가 없을 것입니다. 티, 케이. ArraySize(mas)==mas[]. 크기

루프 본문에서 수행되는 작업은 중요하지 않습니다. 시험에 대한 부담일 뿐입니다.
예제에서는 루프 조건에서 함수 또는 변수에 대한 호출을 비교합니다.

나는 어셈블러의 전문가는 아니지만 어셈블러 지침의 관점에서 이것들은 같은 것이 아니라고 생각합니다.
그리고 그것이 또한 클래스에 싸여 있다면, 더군다나 같은 것이 아닙니다.

함수에는 메모리 셀에서 값을 가져오기 위한 추가 명령이 있습니다. 즉, 함수는 값에 대해 메모리 셀에 액세스한 다음 결과를 반환합니다.
변수에는 이미 이 값이 있고 변수는 아무데도 가지 않고 즉시 결과를 반환합니다.

 
Roman :

루프 본문에서 수행되는 작업은 중요하지 않습니다. 시험에 대한 부담일 뿐입니다.
예제에서는 루프 조건에서 함수 또는 변수에 대한 호출을 비교합니다.

나는 어셈블러의 전문가는 아니지만 어셈블러 지침의 관점에서 이것들은 같은 것이 아니라고 생각합니다.
그리고 그것이 또한 클래스에 싸여 있다면, 더군다나 같은 것이 아닙니다.

함수에는 메모리 셀에서 값을 가져오기 위한 추가 명령이 있습니다. 즉, 함수는 값에 대해 메모리 셀에 액세스한 다음 결과를 반환합니다.
변수에는 이미 이 값이 있고 변수는 아무데도 가지 않고 즉시 결과를 반환합니다.

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

 
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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+=z;
        r1+=z;
        r1+=z;
        r1+=z;
        r1+=z;
        r1+=z;
        r1+=z;
        r1+=z;
        r1+=z;
        r1+=z;
        r1+=z;
        r1+=z;
        r1+=z;
        r1+=z;
        r1+=z;
        r1=r1/ 10 ;
        }
     }
   
   int pi2 = sum*step;
   ulong t3= GetMicrosecondCount ();
   Print (t2-t1, "  " ,t3-t2, " " ,r, " " ,r1, " " ,r2, " " ,pi, " " ,pi2);
// Templ();
  }

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

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

거의 모든 실행에서 리더가 변경됩니다.

이 부분이 가장 길다