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

 
Igor Makanu :

물리적으로 CPU 명령에 있는 경우

배열은 메모리 조각이고 배열 요소에 대한 액세스는 이 메모리 조각의 시작 부분에서 요소 인덱스를 계산하고 저장된 유형에 따라 데이터(바이트)를 추출합니다.


이것이 알고리즘의 논리라면 예 - 이것은 인덱싱된 변수입니다.

일반적으로 연구 중인 문제에 대한 유일한 올바른 조언은 https://www.mql5.com/en/forum/354662/page4#comment_19039624 입니다.

     {
       for ( int i= 0 ; i< ArraySize (mas); i++)
        {  
        r2+= ArraySize (mas);
        r2|= ArraySize (mas); 
        }

     }  
   ulong t2= GetMicrosecondCount ();
   //for(ulong z=0; z<max; z++)
   int sizem= ArraySize (mas);
     {
       for ( int i= 0 ; i<sizem; i++)
        { 
        r2+=sizem;
         if (r2> 10 ) r2|=sizem; 
        }
     } 

바이너리 연산의 실행 시간은 if 문의 실행 시간보다 몇 배 더 빠릅니다(당연히 그래야 함).... 배후에서 깨끗한 또는 초고속 네이티브 코드

위의 시간은 아래의 시간의 절반


기술적으로 우리는 두 변수를 비교하고 있었습니다))

 
Alexandr Andreev :

이진 연산의 실행 시간은 if 문의 실행 시간보다 몇 배 더 빠릅니다.

CX 레지스터의 루프가 실행되기 전에 루프에 if()가 없어야 합니다.

알렉산드르 안드레예프 :

위쪽 시간은 아래쪽 시간의 절반입니다.

나는 그것에 대해 논의하지 않습니다. 아침에 다시 테스트했습니다. 런타임 최적화는 항상 MQL5에서 작동합니다. 결과는 사이클 수에 따라 다릅니다. 음, 다시 테스트하지 않을 것입니다. 시간 낭비입니다.

 
Igor Makanu :

CX 레지스터의 루프가 실행되기 전에 루프에 if()가 없어야 합니다.

나는 그것에 대해 논의하지 않습니다. 아침에 다시 테스트했습니다. 런타임 최적화는 항상 MQL5에서 작동합니다. 결과는 사이클 수에 따라 다릅니다. 음, 다시 테스트하지 않을 것입니다. 시간 낭비입니다.

.... 당신은 당신의 게시물을 따라야합니다)))) 위의 게시물은 ArraySize 연산자가 범위를 벗어나는 것을 확인하는 것으로 가정한 게시물을 나타냅니다(이것은 귀하의 경우입니다). 몸으로 확인하는 것이 정말 가능하며 이것이 유일한 올바른 방법입니다.

그리고 첫 번째 실행과의 차이점은 테스트에만 있습니다)

 
Alexandr Andreev :

그리고 첫 번째 실행과의 차이점은 테스트에만 있습니다)

나에게 당신의 테스트를 줘, 보자

... nafig는 일반적으로 자동으로 분쟁에 참여하지만 사용하는 것을 좋아하지만주기를 종료하는 조건에서 ArraySize () 를 사용하는 것이 좋습니다.

 

크기 .ex5

 void OnStart () // размер 12 272 байт
{
   int arr[];
   ArrayResize (arr, 100 );
   ArrayInitialize (arr, 1 );
   int sum = 0 ;
   for ( int i = ArraySize (arr) - 1 ; i >= 0 ; i--)
   {
      sum += arr[i];
   }
   printf ( "sum = %i" , sum); //sum = 100
}
//+------------------------------------------------------------------+
void OnStart () // размер 11 860 байт
{
   int arr[];
   ArrayResize (arr, 100 );
   ArrayInitialize (arr, 1 );
   int sum = 0 ;
   for ( int i = 0 ; i < ArraySize (arr) - 1 ; i++)
   {
      sum += arr[i];
   }
   printf ( "sum = %i" , sum); //sum = 100
}
//+------------------------------------------------------------------+
void OnStart () // размер  12 174 байт
{
   int arr[];
   ArrayResize (arr, 100 );
   ArrayInitialize (arr, 1 );
   int sum = 0 ;
   for ( int i = 0 , sz = ArraySize (arr); i < sz; i++)
   {
      sum += arr[i];
   }
   printf ( "sum = %i" , sum); //sum = 100
}
 
그리고 컴파일러의 제작자를 제외하고 누가 알겠습니까? 아마도 ArraySize() 는 변수에 액세스하는 것과 정확히 동일하게 작동합니다. 가능한 것 같습니다.
 
Dmitry Fedoseev :
그리고 컴파일러의 제작자를 제외하고 누가 알겠습니까? 아마도 ArraySize()는 변수에 액세스하는 것처럼 작동합니다. 가능한 것 같습니다.
 void OnStart ()
  {
   int mas[];  
   int size= 1000000000 ;
   ArrayResize (mas,size); 
   int r2= 0 ; 
   int tr= 0 ;  
     int num_steps= ArraySize (mas); 
     double step = 1.0 /( double )num_steps;
    
     int v=size;
     ulong t1 = GetMicrosecondCount ();
    
   // for(ulong z=0; z<max; z++)
  
   int sizem=Size(mas);
     {
       for ( int i= 0 ; i<sizem; i++)
        { 
        r2+=sizem;
        r2|=sizem; 
        }
     } 
   ulong t2= GetMicrosecondCount (); 
     {
       for ( int i= 0 ; i<Size(mas); i++)
        {  
        r2+=Size(mas);
        r2|=Size(mas); 
        } 
     }  
   ulong t3= GetMicrosecondCount ();
   
   Print (t2-t1, " " ,t3-t2, " " ,r2) ; 
  }
 
int Size( int &mas[]){ return Size2(mas);} 
int Size2( int &mas[]){ return Size3(mas);} 
int Size3( int &mas[]){ return ArraySize (mas);} 

ArraySize를 호출하는 함수를 호출 하는 함수 를 호출하는 함수와 변수에 액세스하는 것과 같은 속도 간의 테스트가 있습니다. 왜냐하면 컴파일러는 그것들을 확장합니다.

 ArraySize 

ArraySize () 를 사용하는 것이 좋습니다.


순열과 차이가 없습니다.
Документация по MQL5: Основы языка / Функции / Вызов функции
Документация по MQL5: Основы языка / Функции / Вызов функции
  • www.mql5.com
Если некоторое имя, которое не было описано ранее, появляется в выражении и за ним следует левая круглая скобка, то оно по контексту считается именем некоторой функции. Аргументы (формальные параметры) передаются по значению, т. е. каждое выражение x1, . . . , xn вычисляется и значение передается функции. Порядок вычисления выражений и порядок...
 

다시 from_balda 테스트 ....

창작물을 한 번 테스트하는 이유는 무엇입니까?

무슨 일이 일어나는지 확인하기 위해 적어도 10번 테스트

코드를 외부 루프로 래핑하면 결과는 다음과 같습니다.

본사 0 15:26:55.230 tst (EURUSD,H1) 558620 543908 -512

RO 0 15:28:08.672 tst (EURUSD,H1) 544176 543129 -512

EF 0 15:28:09.759 tst (EURUSD,H1) 544139 543144 -512

RM 0 15:28:10.847 tst (EURUSD,H1) 544174 543436 -512

지디 0 15:28:11.934 tst (EURUSD,H1) 543668 543531-512

CR 0 15:28:13.021 tst (EURUSD,H1) 543413 543097 -512

0 15:28:14.107 tst (EURUSD,H1) 543046 543218 -512

HP 0 15:28:15.194 tst (EURUSD,H1) 543337 543469 -512

0 15:28:16.282 tst (EURUSD,H1) 543602 544455 -512

0 15:28:17.369 tst (EURUSD,H1) 543253 543197 -512

씨엘 0 15:28:18.457 tst (EURUSD,H1) 544199 543664 -512

연구 중인 주기를 재정렬하지 않겠습니다. 지겹습니다. 코드의 크기는 위에 나와 있습니다. 이는 코드 분석기를 사용하여 최적화할 수 있음을 의미합니다. 작년에 MQL4 - 4용 iCustom 최적화에서 놀랐습니다. 4=x 표시기 버퍼 의 값에 대한 호출은 효율성에 대한 주제가 있었던 어딘가에 하나의 호출로 대체됩니다.

일반적으로 Metaquotes는 사용자의 일반적인 코드를 잘 분석했습니다. 컴파일러 자체가 사용자의 글을 대부분 정리할 것입니다. .. IMHO 멋져요!

 

죄송합니다. 제가 틀렸을 수도 있습니다. 이 모든 것을 읽지 않았습니다. 첫 페이지만. 인상 - 평소와 같이. 누군가 구체적인 질문을 합니다. 그리고 나서 플루더라스트가 날아옵니다.

다시 한 번 죄송합니다. 여기가 정말 개발자 포럼인가요????

 
Сергей Таболин :

죄송합니다. 제가 틀렸을 수도 있습니다. 이 모든 것을 읽지 않았습니다. 첫 페이지만. 인상 - 평소와 같이. 누군가 구체적인 질문을 합니다. 그리고 나서 플루더라스트가 날아옵니다.

다시 한 번 죄송합니다. 여기가 정말 개발자 포럼인가요????

당신은 착각하고 있습니다. 거기에 HARDWARE의 질문과 다른 다른 질문이 제기되었습니다. 컴파일 원리를 이해하는 것이 때때로 도움이 됩니다.