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

 
Alexandr Andreev :

일반 기능을 배포하는 것은 당연합니다.

저것들. for (int i=0; i<ArraiSize(max); i++)

여기 ArraySize(최대); 펼치면 이 배열의 크기에 대한 주소와 같은 것으로 나타납니다(배열을 보면 변수에 크기가 있고 여기에서는 이 변수에 대한 "메모리의 주소" 대체가 발생합니다). 일반적으로 직접 변수로 변경하는 것은 의미가 없습니다.

for (int i=0; i<ArraiSize(max); i++)

그리고

for (int i=0; i<크기; i++)

이 경우 ArraySize(max)와 size는 배열의 크기를 결정하는 타이밍이 동일합니다.

잘못된 진술

테스트: 1000회 측정, 3개의 어레이 및 각 어레이에 대해 3개의 중첩 반복 루프, 2개의 옵션: 1차2차

결과가 안정적입니다(3회 테스트):

2020.11.02 21:17:25.952 SpeedTst (EURUSD,H1) ArraySize: 루프 = 1000초=114.5013

2020.11.02 21:17:40.713 SpeedTst (EURUSD,H1) cnt: 루프 = 1000초=99.7722

테스트 방법론을 논의하는 데 의미가 없습니다. 매우 길고 필요합니다.
 
Roman :

이 루프 예제에서는 타이밍에 대해 동의하지 않을 수 있습니다.
반대로 크기 변수에 결과를 가져와 조건에서 사용하는 것이 좋습니다.
ArraySize(max)대한 각 반복의 루프는 불필요한 언롤링을 수행하므로 루프 속도가 느려집니다.

ArraySize(max) 함수가 확장되어 길이 레코드가 있는 배열에서 셀을 추출하고 배열의 길이 가 기록된 셀의 주소를 반환합니다.

변수는 무엇이며, 우리의 경우 크기는 배열 의 길이가 기록된 셀의 주소입니다.

저것들. 출력은 동일하며 주기 동안 배열의 크기를 변경하더라도 셀당 주소는 첫 번째 또는 두 번째 경우에 변경되지 않습니다.

이후 우리의 질량 값은 항상 정적입니다(이것은 링크가 아닙니다), 그러면 여기에 다른 논리가 있을 수 없습니다)))

ArraySize(최대) 함수 자체는 여기 에서 배열의 길이를 담당하는 최대 배열의 메모리 섹션을 사용해야 하며 이는 컴파일 단계 - 함수 배포에서 수행 된다고 말합니다.

 
Igor Makanu :

잘못된 진술

테스트: 1000회 측정, 3개의 어레이 및 각 어레이에 대해 3개의 중첩 반복 루프, 2개의 옵션: 1차2차

결과가 안정적입니다(3회 테스트):

2020.11.02 21:17:25.952 SpeedTst (EURUSD,H1) ArraySize: 루프 = 1000초=114.5013

2020.11.02 21:17:40.713 SpeedTst (EURUSD,H1) cnt: 루프 = 1000초=99.7722

테스트 방법론을 논의하는 데 의미가 없습니다. 매우 길고 필요합니다.

그런 다음 어셈블리에 몇 가지 문제가 있습니다 ....

 
Alexandr Andreev :

그런 다음 어셈블리에 몇 가지 문제가 있습니다 ....

출력은 동일하다는 것이 분명합니다.
메모리의 이 섹션은 다른 방식으로 액세스되며 그것이 요점입니다.
변수에 액세스하는 것은 변수에 이미 값이 포함되어 있기 때문에 함수에 액세스하는 것보다 빠릅니다.
그리고 함수는 여전히 이 값을 가져와 반환해야 합니다. 즉, 추가 명령어인 메모리 셀을 참조해야 합니다.

Igor의 예는 내가 말한 내용을 확인하는 것일 뿐입니다.

 
Alexandr Andreev :

그런 다음 어셈블리에 몇 가지 문제가 있습니다 ....

거짓말

ArraySize()에 대한 호출은 모든 반복에서 발생합니다.

배열의 크기를 매번 확인하지 않더라도 프로시저는 여전히 호출되고 적어도 배열의 크기 값을 저장하는 변수는 확인합니다.

여기에 내가 쓰고 있는 것에 대한 테스트가 있습니다. 우리는 주기 에서 배열의 크기를 변경하고 주기는 예상대로 중단되었습니다. 루프를 반복할 때마다 루프 본문을 실행한 후 배열의 크기가 결정되었습니다.

 void OnStart ()
{
   int arr[];
   int sz = ArrayResize (arr, 100000 );
   int cnt = 0 ;
   for ( int i = 0 ; i < ArraySize (arr); i++)
   {
       ArrayResize (arr, sz--);
      cnt++;
   }
   printf ( "cnt = %i" , cnt);   //cnt = 50001
}
 
Igor Makanu :

거짓말

ArraySize()에 대한 호출은 모든 반복에서 발생합니다.

배열의 크기를 매번 확인하지 않더라도 프로시저는 여전히 호출되고 적어도 배열의 크기 값을 저장하는 변수는 확인합니다.

여기에 내가 쓰고 있는 것에 대한 테스트가 있습니다. 우리는 주기에서 배열의 크기를 변경하고 주기는 예상대로 중단되었습니다. 루프를 반복할 때마다 루프 본문을 실행한 후 배열의 크기가 결정되었습니다.

테스트의 전체 코드를 알려주십시오.

로만 :

출력은 동일하다는 것이 분명합니다.
메모리의 이 섹션은 다른 방식으로 액세스되며 그것이 요점입니다.

Igor의 예는 내가 말한 내용을 확인하는 것일 뿐입니다.

그리고 당신이 직접 테스트를 했습니까? 나는 110000000000000000에 그런 것이 없습니다.

더 정확하게는 LONG_MAX 반복해도 테스트에서 이와 같은 것이 없습니다.
 
Alexandr Andreev :

ArraySize(max) 함수가 확장되어 길이 레코드가 있는 배열에서 셀을 추출하고 배열의 길이 가 기록된 셀의 주소를 반환합니다.

변수는 무엇이며, 우리의 경우 크기는 배열 의 길이가 기록된 셀의 주소입니다.

저것들. 출력은 동일하며 주기 동안 배열의 크기를 어떻게든 변경하더라도 셀당 주소는 첫 번째 또는 두 번째 경우에서 이것에서 변경되지 않습니다.

이후 우리의 질량 값은 항상 정적입니다(이것은 링크가 아닙니다), 그러면 여기에 다른 논리가 있을 수 없습니다)))

ArraySize(최대) 함수 자체는 여기 에서 배열의 길이를 담당하는 최대 배열의 메모리 섹션을 사용해야 하며 이는 컴파일 단계 - 함수 배포에서 수행 된다고 말합니다.

이 판단은 성급한 것 같다. ArraySize 함수의 외관 뒤에서 정확히 어떤 일이 발생하는지 알 수 없습니다. 그렇죠? MQL에서 이것은 블랙박스입니다. for (int i=0; i<ArraiSize(max); i++)는 여러 명령문이 실행되는 결과를 초래할 수 있습니다. 예를 들어, 함수는 입력 매개변수의 유효성 을 검사할 수 있습니다. 저장 - 스택에서 데이터를 푸시합니다. 레지스터를 저장합니다. 레지스터를 복원합니다. 함수 호출 - 호출한 다음 반환합니다. 내 말은 백그라운드에서 많은 일들이 일어날 수 있고 우리는 그것을 볼 수 없다는 것입니다. 따라서 (int i=0; i<size; i++) for (int i=0; i<size; i++) 를 사용하는 것이 더 안전하고 우리가 기대하는 것을 수행하기 위해 컴파일러에 의존하지 않습니다.

 
Alexandr Andreev :

그리고 당신이 직접 테스트를 했습니까? 나는 110000000000000000에 그런 것이 없습니다.


이것은 오랫동안 테스트되었으므로 사이클에서 변수만 사용합니다.

 
Roman :

이것은 오랫동안 테스트되었으므로 사이클에서 변수만 사용합니다.

코드로 테스트를 보여주세요

 
Alexandr Andreev :

코드로 테스트를 보여주세요

네, 무슨 테스트요? ))
당신은 루프 조건의 두 가지 변형을 모두 보여주었습니다.
Igor는 또한 위의 코드를 가져왔습니다.
루프 조건에서 size 변수와 ArraySize() 를 사용하여 루프 실행을 측정하기만 하면 됩니다.