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

 

Como um acompanhamento:


Qual das linhas (1, 2 ou 3) ainda é de recursos intensivos?

Eu não consigo entender como o iTime "pesado", que leva 55% do tempo de todo o programa, mostra apenas 0,81% de Auto CPU?
E vice versa - por que o suporte de abertura (1) e a condição mais simples (2, verdade muito raramente) mostram 33,84% de Auto CPU?

Por que a Auto CPU e a CPU Total não são compatíveis?


A função é realmente pesada, mas todo o seu peso está localizado mais abaixo no código. E o profiler sugere a procura de um substituto para o iTime e duas variáveis booleanas?!

Obviamente, eu não entendo algo.

 
Andrey Khatimlianskii:

Obviamente me está faltando algo.

Escorregando talvez?

 
Andrei Trukhanovich:

Escorregando talvez?

Não parece ser assim, os números do relatório são os mesmos.

 
Andrey Khatimlianskii:

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 no relatório de forma alguma?


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.

1) Sem código é difícil dizer porque estas estatísticas são tão ruins, talvez devido à otimização

2) Por que não tentar obter o tempo na função Temporizador, antes do loop e passá-lo como parâmetro, de que adianta chamar esta função pelo menos 2*N vezes no loop ?

 
Andrey Khatimlianskii:

Como um acompanhamento:


Qual das linhas (1, 2 ou 3) ainda é de recursos intensivos?

Eu não consigo entender como o iTime "pesado", que leva 55% do tempo de todo o programa, mostra apenas 0,81% de Auto CPU?
E vice versa - por que o suporte de abertura (1) e a condição mais simples (2, verdade muito raramente) mostra 33,84% de Auto CPU?

Por que a Auto CPU e a CPU Total não são compatíveis?


A função é realmente pesada, mas todo o seu peso está localizado mais abaixo no código. E o profiler sugere a procura de um substituto para o iTime e duas variáveis booleanas?!

Obviamente, eu não entendo algo.

1) Suponho que a função tenha sido simplificada

2) Os contadores são realmente não relacionados, SelfCPU é a carga no código da função, sem levar em conta as funções chamadas, no código dado, é um abridor IF (ramificação)

3) O contador TotalCPU mostra a carga do ramo de execução, para todas as chamadas neste ramo do programa

 

Não deveria ser sempre 100%? Ou ainda um pouco menos, considerando também @global_initializações e @global_deinicializações.

Aqui está mais de 102% ...(Construir 3003 sobre dados históricos).

 
Ilyas :

1) Suponho que a função tenha sido simplificada

2) Os contadores não estão realmente relacionados, o SelfCPU é a carga no código da função, sem levar em conta as funções chamadas, no código acima, é um abridor IF (ramificação)

3) O contador TotalCPU mostra a carga de um ramo de execução, para todas as chamadas neste ramo do programa.

Qual é a sua utilidade? Obviamente, a declaração IF por si só tem uma baixa carga de CPU. Não deveria incluir chamadas de função?

Em qualquer caso. Como entender (a partir do exemplo de Andrew):

if(!simulated) taking 3.86% ?!?

E quanto a isto ????


onde parecemos estar na mesma função do Tick ()!

Eu realmente quero usar o Profiler e entendê-lo, mas nada disso faz sentido. Desculpe.

O que fazer ? Como podemos ajudar ?

 
Ilyas:

1) Sem código é difícil dizer por que as estatísticas são tão ruins, talvez seja por causa da otimização

2) Por que não tentar obter o tempo na função Timer antes do loop e passá-lo como parâmetro, qual é o objetivo de chamar esta função pelo menos 2*N vezes no loop ?

Obrigado pelas respostas!

1) Eu dificilmente posso reproduzi-lo em um código simples, sim. E eu não estou pronto para entregar o projeto inteiro.

2) Neste caso em particular, concordo.

Mas há muitas outras classes que usam o mesmo controle ou um controle semelhante e não podem passar sem o TimeCurrent ou GetTickCount.
Como otimizar sua chamada para não solicitar o mesmo valor várias vezes?

E o TimeCurrent é realmente tão pesado, que pode ser notado no fundo de cálculos realmente pesados (mesmo se realizados a cada 1 ou 5 minutos)?
Ou eu me enganei novamente e 38,16% do Total de CPU / 26,07% do Auto CPU foi ocupado verificando se ele mesmo (sem considerar a chamada de funçãoTimeCurrent)? Mas por que isto é assim?


Ilyas:

1) Vou assumir que a função estava em linha

2) Os contadores não estão realmente relacionados, SelfCPU é a carga sobre o código da função, não levando em conta as funções chamadas, no código acima, é o abre IF (ramificação)

3) O contador TotalCPU mostra a carga de um ramo de execução, por todas as chamadas neste ramo do programa

1) Não ajuda a entender por que um parêntese de abertura tão voraz. Como interpretar isto?

2) Sobre o SelfCPU agora está claro, obrigado. É uma carga de código de função sem considerar as funções que estão sendo chamadas.

Isto também explica o baixo SelfCPU do fio com o iTime - foi muito raramente alcançado, só raramente foi chamado.

Mas por que a TotalCPU é tão alta? Ou mostra a carga de todas as funções do iTime (e outras funções do CopyXXX?) em todo o programa?

 
Andrey Khatimlianskii:

Obrigado por suas respostas!

1) Acho que não consigo reproduzi-lo em código simples, sim. E eu não estou pronto para entregar o projeto inteiro.

2) Neste caso em particular, concordo.

Mas há muitas outras classes que usam o mesmo controle ou um controle semelhante e não podem passar sem o TimeCurrent ou GetTickCount.
Como otimizar sua chamada para não solicitar o mesmo valor várias vezes?

E o TimeCurrent é realmente tão pesado, que pode ser notado no fundo de cálculos realmente pesados (mesmo se realizados a cada 1 ou 5 minutos)?
Ou talvez eu tenha me enganado novamente e 38,16% do Total de CPU / 26,07% do Auto CPU foi ocupado pela própria verificação (sem a chamada de funçãoTimeCurrent)? Mas então por que é assim?


1) Não ajuda a entender por que um parêntese de abertura tão voraz. Como interpretar isto?

2) Sobre o SelfCPU agora está claro, obrigado. É uma carga de código de função sem considerar as funções que estão sendo chamadas.

Isto também explica o baixo SelfCPU do fio com o iTime - foi muito raramente alcançado, só raramente foi chamado.

Mas por que um TotalCPU tão grande? Ou mostra a carga de todas as funções do iTime (e outras funções do CopyXXX?) em todo o programa?

Pegue qualquer código da entrega padrão, revise-o e faça perguntas com base nele, por favor. Isto permitirá uma avaliação reprodutível da situação e fornecerá respostas precisas.

Caso contrário, não adianta responder a pequenos trechos de seu código para relatórios de perfiladores. Há uma enorme quantidade de trabalho de otimização nos bastidores, o que transforma todo o seu código em uma representação completamente diferente e embutida.


Para informação: Deus proíbe que 1 em cada 100 programadores de C++ possa usar o perfilador e compreender seus relatórios. A razão é o otimizador de código nativo.

 
Alain Verleyen:

Em qualquer caso. Como entender (a partir do exemplo de Andrew):

if(!simulated) taking 3.86% ?!?

Sim, sem considerar as chamadas de funções externas, a SelfCPU não é muito informativa. Somente no nível mais baixo, onde são utilizadas funções MQL nativas, você verá a carga real.
Mas neste caso não ficará claro de quais lugares essas funções são chamadas com mais freqüência (e consomem mais), e de quais há chamadas únicas! Bem, para que serve saber que as funções CopyXXX e OrderXXX são as que mais consomem tempo? Preciso saber de quais pedaços do meu programa eles são chamados com demasiada freqüência/ineficiência.

Acho que é para isso que serve o modo , combinado com o TotalCPU. Estarei investigando. Mas até agora vejo até linhas completamente comentadas (!).