Sobre o profiler do código MT5 - página 2

 
Ilyas :

A captura de tela mostra as estatísticas da seqüência de chamadas e não a função SymbolInfoTick.

No total, a corda dada foi medida 210 vezes, uma vez que foi "parada" exatamente na corda, antes da chamada SymbolInfoTick ou logo após, e 209 vezes como a corda de retorno de SymbolInfoTick

Desculpe, mas não está claro.

O resumo do profiler diz:

SymbolInfoTick () Total de CPU: 209 (0,83%)

O próprio código diz:

SymbolInfoTick () Total de CPU: 210 (2,57%)

SymbolInfoTick () ocorre apenas UMA vez no código. O que estes diferentes valores não são de forma alguma claros. OK, 209 contra 210, você disse que é porque "parou" um naquela linha (não faz sentido para mim, mas acho que não importa muito).

E quanto à %?

0 2021.07.10 11: 52: 19.032 MQL5 Profiler Medidas totais 25039, erros 0/0, memória de pilha de 99 MB analisada (92872/10737418424)

Portanto 209 (0,83%) significa 100% = 25039. OK

Mas 210 (2,57%) significa 100% = 8171?!? O que é 8171 para CPU Total?

 
Alain Verleyen :

E quanto a isto ( post #1 )?

Como você pode ver, SymbolInfoTick () é mostrado como a parte mais difícil do código. O que é incorreto. Este é o mesmo código dos seguintes posts (que mostra SymbolInfoTick com Total CPU = 209 (0,83%), o que é correto), a diferença é que eu comentei a linha onde SymbolInfoTick () era Total CPU = 1. O tempo total de execução (de acordo com dados históricos) não mudou com esta pequena mudança, mas os resultados do perfilador foram diferentes.

Eu posso fornecer o código em particular se você quiser verificar.

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

Sinto muito, mas não está claro.

O resumo do profiler diz:

SymbolInfoTick () Total de CPU: 209 (0,83%)

O próprio código diz:

SymbolInfoTick () Total de CPU: 210 (2,57%)

SymbolInfoTick () ocorre apenas UMA vez no código. O que estes diferentes valores não são de forma alguma claros. OK, 209 contra 210, você disse que é porque "parou" um naquela linha (não faz sentido para mim, mas acho que não importa muito).

E quanto à %?

0 2021.07.10 11: 52: 19.032 MQL5 Profiler Medidas totais 25039, erros 0/0, memória de pilha de 99 MB analisada (92872/10737418424)

Portanto 209 (0,83%) significa 100% = 25039. OK

Mas 210 (2,57%) significa 100% = 8171?!? O que é 8171 para CPU Total?

Você está comparando estatísticas para "linha de código" e para "função"

Há uma linha de código

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

Um total de 210 vezes esta seqüência foi incluída nas estatísticas:

  • 209 vezes como uma linha de código a partir da qual o SymbolInfoTick é chamado
  • 1 vez como se o operador

Há uma função SymbolInfoTick, esta função atingiu as estatísticas 209 vezes.
A função só é chamada a partir desta linha de código, talvez por isso você tenha se confundido com os contadores


Quanto aos números:
Portanto, 209 (0,83%) significa 100% = 25039. OK

não é, os números são apenas semelhantes: 209 / 0,83 * 100 = 25180


Mas 210 (2,57%) significa 100% = 8171?!? O que é 8171 para CPU Total?

Correto, de 25039 medidas, 8171 delas vieram da linha de código com a chamada SymbolInfoTick

 

Alain Verleyen:

O backtest funcionando em:

2021.07.10 08:00: 37.101 Core 01 EURUSD, H1: 230861 carrapatos, 998 barras geradas. O teste passou em 0: 03: 09.367 (incluindo o pré-processamento de carrapatos 0: 00: 00.515).

Adicionei código para medir o tempo de execução do SymbolInfoTick () usando GetMicrosecondCount ().

       ulong start= GetMicrosecondCount ();

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

      BENCH += GetMicrosecondCount ()-start;

Resultado:

2021.07.10 08:00: 37.101 Core 01 2021.05.30 23:59:59 Total = 1209572 Executado = 836973 em 661874 microssegundos

Assim, o SymbolInfoTick () levou um total de 661 milissegundos sobre os dados históricos em 3 minutos e 9 segundos. Entretanto, o perfilador mostra que utiliza 74,71% das medidas. Como isto é preciso ou útil, eu não entendo.


Deixe-me ser claro, testar não se trata apenas de executar o código MQL + o profiler, capturando estatísticas, retarda um pouco a execução.


Dito isto, no relatório, 74,71% é um número relativo ao código MQL, e não testes em geral.

 

Olá @Ilyas!

Obrigado. Vou verificar novamente com suas respostas e mantê-lo-ei informado.

 
Ilyas:
...

Quanto aos números:

não é, os números são apenas semelhantes: 209 / 0,83 * 100 = 25180


Correto, de 25039 medidas, 8171 delas vieram da linha de código com a chamada SymbolInfoTick

Eu me enganei nos números.

De fato, 209 é 0,83469% de 25039, o que foi arredondado para 0,83


8171 amostras foram coletadas na linha com SymbolInfoTick chamada 210 vezes, ou seja, 2,57%.

 
Ilyas :

Eu me enganei nos números.

De fato, 209 é 0,83469% de 25039 arredondado para 0,83


8171 execuções foram em um ramo de execução de programa onde a linha que chama SymbolInfoTick foi executada 210 vezes, ou seja, 2,57%.

Execução da OnTimer (), então não está bem claro porque é 8171? Quando OnTimer () Total de CPU mostra 29683.
 
Alain Verleyen:
Execução da OnTimer (), então não está bem claro porque é 8171? Quando OnTimer () Total de CPU mostra 29683.

Por favor, forneça o código, eu verificarei novamente o funcionamento dos balcões

 
Ilyas :

Por favor, forneça o código, eu verificarei novamente o funcionamento dos balcões

Vou fazer isso em particular assim que tiver tempo. Obrigado.
 
Ilyas:

Ilyas, ajude-me a descobrir isso também.

1. Por que uma chamada de função vazia pode levar 34,5% de Auto CPU? Ao mesmo tempo, a chamada da função que a segue, cujos internos ocupam 38,16% do total da CPU, não aparece de forma alguma no relatório?


Código de função:



2. Este exemplo mostra o segundo problema: a linha com TimeCurrent() leva um tempo exageradamente longo não apenas dentro da função, mas no programa em geral:

Antes de comentar o corpo da CheckTimeSeries(), a carga principal estava em sua linha TimeCurrent().

É realmente uma função tão pesada? Com o que substituí-lo? Ou como torná-lo econômico (caching dentro de um loop da execução do programa)?

Onde quer que eu possa, eu salvo os cálculos, diluindo-os (uma vez por barra, uma vez a cada X segundos, uma vez a cada Y ms, etc.). Mas acontece que a verificação em si, se deve ou não fazer os cálculos, é bastante intensiva em recursos.


Obrigado pela ajuda.