MT5 코드 프로파일러 정보 - 페이지 2

 
Ilyas :

스크린샷은 SymbolInfoTick 함수가 아닌 호출 문자열에 대한 통계를 보여줍니다.

이 라인은 SymbolInfoTick을 호출하기 전이나 직후에 정확히 라인에 "중지"가 발생하면 210번 잡혔고 SymbolInfoTick에서 리턴 라인으로 209번 잡혔습니다.

죄송하지만 이것은 명확하지 않습니다.

프로파일러 요약은 다음과 같이 말합니다.

SymbolInfoTick () 총 CPU: 209(0.83%)

코드 자체는 다음과 같이 말합니다.

SymbolInfoTick() 총 CPU: 210(2.57%)

SymbolInfoTick()은 코드에서 한 번만 발생합니다. 이러한 다른 가치가 무엇인지 완전히 불분명합니다. 좋아, 209 대 210, 당신은 그가 그 라인에서 하나를 "멈췄기" 때문이라고 말했습니다(저에게는 논리적이지 않지만 제 생각에는 큰 문제는 아닙니다).

%는 어떻습니까?

0 2021.07.10 11:52:19.032 MQL5 프로파일러 25039 총 측정, 0/0 오류, 구문 분석된 99MB의 스택 메모리(92872/1073741824)

따라서 209(0.83%)는 100% = 25039를 의미합니다. 확인

하지만 210(2.57%)은 100% = 8171?!? 총 CPU의 경우 8171은 무엇입니까?

 
Alain Verleyen :

이것은 어떻습니까( 포스트 #1 )?

보시다시피 SymbolInfoTick()은 코드에서 가장 무거운 부분으로 표시됩니다. 뭐가 잘못 되었 니. 이것은 다음 게시물과 동일한 코드입니다(Total CPU = 209(0.83%)인 SymbolInfoTick이 정확함). 차이점은 SymbolInfoTick()이 Total CPU = 1인 줄을 주석 처리했다는 것입니다. 총 실행 시간 (이력 데이터)는 이 사소한 변경으로 변경되지 않았지만 프로파일러 결과는 다릅니다.

코드를 확인하고 싶다면 비공개로 코드를 제공할 수 있습니다.

О профилировщике кода MT5
О профилировщике кода MT5
  • 2021.07.09
  • www.mql5.com
Я начал использовать новый профайлер. В этом разделе мы могли бы централизовать информацию о том, как его правильно использовать...
 
Alain Verleyen :

죄송하지만 이것은 명확하지 않습니다.

프로파일러 요약은 다음과 같이 말합니다.

SymbolInfoTick () 총 CPU: 209(0.83%)

코드 자체는 다음과 같이 말합니다.

SymbolInfoTick() 총 CPU: 210(2.57%)

SymbolInfoTick()은 코드에서 한 번만 발생합니다. 이러한 다른 가치가 무엇인지 완전히 불분명합니다. 좋아, 209 대 210, 당신은 그가 그 라인에서 하나를 "멈췄기" 때문이라고 말했습니다(저에게는 논리적이지 않지만 제 생각에는 큰 문제는 아닙니다).

%는 어떻습니까?

0 2021.07.10 11:52:19.032 MQL5 프로파일러 25039 총 측정, 0/0 오류, 구문 분석된 99MB의 스택 메모리(92872/1073741824)

따라서 209(0.83%)는 100% = 25039를 의미합니다. 확인

하지만 210(2.57%)은 100% = 8171?!? 총 CPU의 경우 8171은 무엇입니까?

"코드 줄"과 "함수"에 대한 통계를 비교하고 있습니다.

코드 라인이 있습니다

       if (! SymbolInfoTick (symbolф,tickф))     // Total CPU : 210 (2.57%)  Self CPU : 1 (1.49%)

전체적으로 이 행은 통계에 210번 포함되었습니다.

  • SymbolInfoTick이 호출되는 코드 행의 209배
  • 1번 if 문

SymbolInfoTick 함수가 있는데 이 함수는 통계에 209번 포함되었습니다.
함수는 이 코드 줄에서만 호출되며, 이것이 아마도 카운터와 혼동한 이유일 것입니다.


숫자에 관해서:
따라서 209(0.83%)는 100% = 25039를 의미합니다. 확인

그렇지 않습니다. 숫자는 비슷합니다: 209 / 0.83 * 100 = 25180


하지만 210(2.57%)은 100% = 8171?!? 총 CPU의 경우 8171은 무엇입니까?

맞습니다. 25039개의 측정값 중 8171개가 SymbolInfoTick에 대한 호출과 함께 코드 라인에 떨어졌습니다.

 

Alain Verleyen :

백테스트 는 다음에서 실행됩니다.

2021.07.10 08:00:37.101 코어 01 EURUSD, H1: 230861 틱, 998 막대가 생성되었습니다. 환경은 0:00:00.144에 동기화됩니다. 테스트는 0:03:09.367 (0:00:00.515 틱 사전 처리 포함)에 통과했습니다.

GetMicrosecondCount()를 사용하여 SymbolInfoTick()의 실행 시간을 측정하는 코드를 추가했습니다.

       ulong start= GetMicrosecondCount ();

       //--- Get tick information
       if (! SymbolInfoTick (symbol,tick))
         return ( false );

      BENCH += GetMicrosecondCount ()-start;

결과:

2021.07.10 08:00:37.101 코어 01 2021.05.30 23:59:59 총계 = 1209572 완료 = 836973( 661874마이크로초 )

따라서 SymbolInfoTick()은 3분 9초의 과거 데이터에서 총 661밀리초가 소요되었습니다. 그러나 프로파일러는 측정값의 74.71%를 사용함을 보여줍니다. 이것이 얼마나 정확하거나 유용한지 이해가 되지 않습니다.


분명히 말씀드리자면, 테스트는 MQL 코드 + 프로파일러의 실행뿐만 아니라 통계를 취하여 실행 속도를 약간 늦춥니다.


동시에 보고서에서 74.71%는 MQL 코드에 관한 수치로 일반적인 테스트가 아니다.

 

안녕하세요 @Ilyas!

고맙습니다. 답변을 바탕으로 모든 것을 다시 확인하고 계속 업데이트하겠습니다.

 
Ilyas :
...

숫자에 관해서:

그렇지 않습니다. 숫자는 비슷합니다: 209 / 0.83 * 100 = 25180


맞습니다. 25039개의 측정값 중 8171개가 SymbolInfoTick에 대한 호출과 함께 코드 라인에 떨어졌습니다.

숫자를 다 틀렸어요

실제로 209는 0.83으로 반올림된 25039의 0.83469%입니다.


8171 측정은 SymbolInfoTick 호출이 있는 행이 210번 실행된 프로그램 실행 분기(2.57%)에 떨어졌습니다.

 
Ilyas :

숫자를 다 틀렸어요

실제로 209는 0.83으로 반올림된 25039의 0.83469%입니다.


8171 측정은 SymbolInfoTick 호출이 있는 행이 210번 실행된 프로그램 실행 분기(2.57%)에 떨어졌습니다.

OnTimer()에서 실행하므로 8171인 이유가 완전히 명확하지 않습니까? OnTimer() 총 CPU가 29683을 표시할 때.
 
Alain Verleyen :
OnTimer()에서 실행하므로 8171인 이유가 완전히 명확하지 않습니까? OnTimer() 총 CPU가 29683을 표시할 때.

코드를 알려주세요. 카운터 작동을 다시 확인하겠습니다.

 
Ilyas :

코드를 알려주세요. 카운터 작동을 다시 확인하겠습니다.

시간이 나는 대로 혼자 하겠습니다. 고맙습니다.
 
Ilyas :

일리아스, 내가 알아낼 수 있게 도와줘.

1. 왜 빈 함수를 호출하면 자체 CPU의 34.5%를 차지할 수 있습니까? 동시에, 전체 CPU의 38.16%가 내부를 실행하는 그 뒤를 따르는 함수의 호출은 리포트에 전혀 표시되지 않습니까?


기능 코드:



2. 같은 예는 두 번째 문제를 보여줍니다. TimeCurrent()가 있는 행은 함수뿐만 아니라 일반적으로 프로그램 내에서도 시간이 너무 오래 걸립니다.

CheckTimeSeries() 본문을 주석 처리하기 전에 대부분의 로드는 TimeCurrent() 라인에 있었습니다.

기능이 그렇게 무거운가요? 무엇으로 교체할까요? 또는 경제적으로 만드는 방법(하나의 프로그램 실행 주기 내에서 캐싱)?

가능한 한 경제적인 계산을 수행하고 계산을 얇게 합니다(막대당 한 번, X초당 한 번, Yms당 한 번 등). 그러나 계산이 필요한지 여부를 확인하는 것 자체가 리소스를 많이 사용하는 것으로 나타났습니다.


도와주셔서 감사합니다.

사유: