MT5 코드 프로파일러 정보

 

새로운 프로파일러를 사용하기 시작했습니다. 이 섹션에서는 올바르게 사용하는 방법에 대한 정보를 중앙 집중화할 수 있습니다.

먼저 반환된 데이터에 대한 이상한 점에 대해 몇 가지 질문이 있습니다.   프로파일러 .

과거 데이터 EA에 사용된 프로파일링 보고서:

2021.07.08 15:43:06.269   MQL5 profiler   139098  total measurements, 0/0 errors, 320 mb of stack memory analyzed (92848/1073741824)

2021.07.08 15:43:06.269   MQL5 프로파일러   982065 총 기능 프레임을 찾았습니다(279627 mql5 코드, 122460 내장,   571051 기타 , 8927 시스템)

결과(호출별 기능):

Q1. 보고서에는 139098개의 측정값이 표시되어 있지만 OnTick() 총 CPU는 150026개입니다. 어떻게 그게 가능합니까? (그러나 CopyHistoryData 80087이 57.58%라는 것은 정확히 100% = 139098을 의미합니다).

Q2. 보고서는 571,051개의 다른 "기능"을 참조합니다. mql도, 내장 함수도, 시스템 함수도 아닌 경우 이러한 함수는 무엇입니까?

Q3. CopyHistoryData는 80087 총 CPU를 보여주며, 보고된 3개의 함수 호출(CopyHigh, CopyLow, CopyTime)은 총 CPU가 서로 다릅니다. 그러나 이러한 기능의 기본 CPU는 동일하며 총 CPU(호출 스택)와 동일합니다. CopyHistoryData의 80087(스택)에서 3개의 함수에 대한 합계가 62,161(44286 + 9448 + 8427)이기 때문에 이것은 잘못된 데이터인 것 같습니다. 불가능합니다. 유일한 설명은 이 숫자가 CopyHistoryData에 대해 전역적이므로 쓸모가 없다는 것입니다. 내가 뭔가를 놓치고 있습니까?

 

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

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%를 사용함을 보여줍니다. 이것이 얼마나 정확하거나 유용한지 이해가 되지 않습니다.

 

이상한 데이터의 또 다른 예입니다.

글로벌 통계에 따르면 SymbolInfoTick()은 209번 호출 스택에 있었습니다. 그러나 210은 코드 내부에 작성되어 있습니다.

글로벌 통계에 따르면 샘플 은 SymbolInfoTick에 209번(전체 샘플 수의 0.83%) 도달했습니다 . 확인. 이제 코드의 데이터는 그가 1회에 도달했다고 말합니다(현재 1.49%이므로 다른 합계로 전환하면 어느 것입니까?). 계산 후 1이 1.49%라는 것은 전체(100%)가 67이라는 의미입니다. 따라서 1.49%는 이 경우의 주요 함수인 OnTimer()를 나타냅니다. 그러나 어떻게 세계 통계에 1이 있고 209가 있을 수 있습니까?

버그가 아니더라도 어떻게 빨리 유용할 수 있습니까(내 생각에 프로파일러는 무엇이어야 합니까)?

 

또 다른

이것은 앞에서 본 SymbolInfoTick() 위의 코드 줄입니다. 따라서 newTick = false와 같은 할당은 5번 "선택"되었습니다! SymbolInfoTick()(1 - 1.49%)을 호출 한 후 5번 더? 농담은 제쳐두고?

 
이것은 아마도 버그일 것입니다. 서비스 데스크에 문의하십시오.
 

무엇이 무엇이고 차이점이 무엇인지 물어보십시오:

  • 샘플링 기반 프로파일링(현재 Visual Studio C ++ 및 기타와 유사)
  • 코드 계측에 기반한 프로파일링(이전에 했던 것처럼)

 
Renat Fatkhullin :

무엇이 무엇이고 차이점이 무엇인지 물어보십시오:

  • 샘플링 기반 프로파일링(현재 Visual Studio C ++ 및 기타와 유사)
  • 코드 계측에 기반한 프로파일링(이전에 했던 것처럼)

차이점은 분명합니다.

문제는 일관성 없는 데이터와 오류가 있는 상태에서 실제로 사용하는 것입니다.

 
Alain Verleyen :

이상한 데이터의 또 다른 예입니다.

글로벌 통계에 따르면 SymbolInfoTick()은 209번 호출 스택에 있었습니다. 그러나 210은 코드 내부에 작성되어 있습니다.

글로벌 통계에 따르면 샘플 은 SymbolInfoTick에 209번(전체 샘플 수의 0.83%) 도달했습니다 . 확인. 이제 코드의 데이터는 그가 1회에 도달했다고 말합니다(현재 1.49%이므로 다른 합계로 전환하면 어느 것입니까?). 계산 후 1이 1.49%라는 것은 전체(100%)가 67이라는 의미입니다. 따라서 1.49%는 이 경우의 주요 함수인 OnTimer()를 나타냅니다. 그러나 어떻게 세계 통계에 1이 있고 209가 있을 수 있습니까?

버그가 아니더라도 어떻게 빨리 유용할 수 있습니까(내 생각에 프로파일러는 무엇이어야 합니까)?

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

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

 
Alain Verleyen :

또 다른

이것은 앞에서 본 SymbolInfoTick() 위의 코드 줄입니다. 따라서 newTick = false와 같은 할당은 5번 "선택"되었습니다! SymbolInfoTick()(1 - 1.49%)을 호출 한 후 5번 더? 농담은 제쳐두고?

뭐라고 쓰여 있는지 잘 이해가 되지 않았습니다.

이 스크린샷을 다음과 같이 읽어야 합니다. 라인이 5번 "중지됨", 전체 로드 중 0.06%, 해당 라인이 속한 함수의 코드 - 7.46%


 

"자체 CPU" 카운터는 이 라인이 위치한 기능의 속도에 대한 라인 코드의 영향을 표시합니다.
중요, 라인에서 호출된 함수의 시간은 이 카운터에 의해 고려되지 않습니다. 아마도 이것은 사실이 아닐 것입니다. 우리는 생각할 것입니다.


"Total CPU" 카운터는 전체 프로그램에 대한 라인 코드의 영향을 보여주며 이 카운터는 라인에서 호출되는 함수를 고려합니다.

 
Ilyas :

뭐라고 쓰여 있는지 잘 이해가 되지 않았습니다.

이 스크린샷을 다음과 같이 읽어야 합니다. 라인이 5번 "중지됨", 전체 로드 중 0.06%, 해당 라인이 속한 함수의 코드 - 7.46%


네 알겠습니다. (이전 톤에 대해 죄송합니다. 조금 화를 냈습니다.)

문제는 다음 위치에 있습니다.

      newTickф  = false ;                     // Total CPU : 5 (0.06%)    Self CPU : 5 (7.46%)

안녕히 계세요

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

전체적인 프로세서는 괜찮습니다.

그러나 Self CPU에 관한 한 어떻게 "newTick=false"가 5이고 SymbolInfoTick ()과 같은 함수 호출이 1일 수 있습니까? 그것은 나에게 의미가 없습니다.

사유: