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

 
Igor Makanu :

루프 본문에서 배열의 크기를 변경하면 즉석 최적화가 더 이상 작동하지 않습니다.

따라서 코드를 변경하십시오.

)))) 크기 변수의 값을 변경하는 데 탐닉하는 것뿐입니다. 즉, ArraySize를 사용 하는 명목상의 첫 번째 방법이 이기는 것입니다.

 
Alexandr Andreev :

글쎄, IMHO에 대해 나는 아무 말도 할 수 없습니다.

매우 큰 리플레이에서 승리는 첫 번째와 두 번째 방법에서 무작위가 되었습니다. 아마도 현재 순간의 프로세서 캐시와 총 부하에 따라 달라질 것입니다.

문제는 주기에 관한 것이 아니라 기능 해제에 관한 것이었습니다. 예를 들어 ArraySize

좋다) 고급 언어의 완성도는 편리한 표기가 편하지 않은 만큼 저렴하지만 처음에는 저렴할 때 드러난다. 이것이 항상 그런 것은 아니며 신규 이민자에 대한 도움이 항상 전혀 그렇지 않다는 것은 유감입니다 ..... 질문이 없을 것입니다)))

 
Igor Makanu :

루프 본문에서 배열의 크기를 변경하면 즉석 최적화가 더 이상 작동하지 않습니다.

따라서 코드를 변경하십시오.


초과하지 않는다

런타임 최적화가 주도할 것입니다.

프로파일러 없이는 이러한 간단한 기계 명령을 테스트할 수 없습니다. 일반적으로 루프에서 원하는 대로 작성할 수 있습니다. 옵션으로 테스터에서 테스트할 수 있습니다. 속도가 중요합니다.

주기에 관한 것이 아니라 컴파일러가 함수를 어떻게 래핑하는지 ..... 뭐, 일반적으로.

나는 당신을 떠날 것입니다

 
Alexandr Andreev :

)))) 크기 변수의 값을 변경하는 데 탐닉하는 것뿐입니다. 즉, ArraySize를 사용 하는 명목상의 첫 번째 방법이 이기는 것입니다.

위에 추가했습니다. 이러한 간단한 코드는 단순히 측정으로 테스트되지 않습니다. 많은 요인이 있습니다. 코드는 크기가 작습니다. 모두 프로세서 캐시에 들어가고, 코드는 프로세서에서 병렬 마이크로 명령으로 잘 분할되어야 합니다. 프로세서 파이프라인, 즉 레지스터는 데이터 프리페치에 의해 빠르게 로드됩니다.

글쎄, 아마도 rand()도 어딘가에 잘 캐시되기 시작했을 것입니다.


일반적으로 디버거 없이 여기에서 테스트하는 방법을 모릅니다. 적어도 여기에서는 명령의 실행 시간을 사이클 단위로 볼 수 있습니다.

 
Alexandr Andreev :

그렇지 않으면 나를 증명해

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

내 게시물을 변경했습니다.
반대로 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
 
Roman :

뭔가 이상한.
루프 조건에서 ArraySize (arr)를 사용하면 cnt 변수를 사용하는 것보다 시간이 더 적게 표시됩니다.
예전에는 반대였습니다. 이것이 실수일 수 있습니까? 그러면 안됩니다.

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

 cnt

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

 
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
Внешние функции, определенные в другом модуле, должны быть явно описаны. Описание включает в себя тип возвращаемого значения, имя функции и набор входных параметров с их типами. Отсутствие такого описания может привести к ошибкам при компиляции, компоновке или выполнении программы. При описании внешнего объекта используйте ключевое слово С...
 

테스트 옵션으로 - 각 테스트에 고유한 배열만 넣을 수도 있습니다(예: arr1, arr2 ..).

저것들. tst1_arr1[],tst1_arr2[] .... 및 tst2_arr1[],tst2_arr2[]가 됩니다.


더 정직한 테스트가 될 것입니다

나 꺼져있어 너무 산만 해 - IMHO, 편리해, 그것을 사용

 
Igor Makanu :

일반적으로 디버거 없이 여기에서 테스트하는 방법을 모릅니다. 적어도 여기에서는 명령의 실행 시간을 사이클 단위로 볼 수 있습니다.

네, 디버거가 어디에도 없습니다. 그리고 거기 비트에서 ...

 
Roman :

뭔가 이상한.
루프 조건에서 ArraySize (arr)를 사용하면 cnt 변수를 사용하는 것보다 시간이 더 적게 표시됩니다.
예전에는 반대였습니다. 이것이 실수일 수 있습니까? 그러면 안됩니다.

무작위 결과입니다. 컴파일할 때 배열 크기의 값으로 메모리 셀에 대한 접근이 풀리고 배열이 형성될 때 배열이 동적이더라도 배열의 크기를 미리 획득하여 메모리 셀에 배치합니다. 배열 크기와 변수 값이 있는 셀은 액세스 시간이 동일합니다.

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