Obter o número de casas decimais de quaisquer números (não apenas citações) contornando Dígitos() em MQL4 e MQL5 - página 15

 
Igor Makanu:

se ArrayCopy() for feito da mesma forma que Cysh memmove(),

Eu acho que a velocidade do ArrayCopy() depende da velocidade de alocação de memória, se a memória intermediária do buffer estiver pronta para copiar, o ArrayCopy() será executado muito rapidamente, se a memória não for alocada, você iniciará solicitações ao sistema operacional para alocar memória

você pode tentar testá-lo - fazer uma chamada ao ArrayCopy() com um grande volume de dados, preparando assim a memória buffer para a troca, e então fazer um loop com o ArrayCopy() com um volume de dados menor para ser copiado e então medir a velocidade

Em nosso exemplo atual, a cópia é executada em uma matriz estática, mas em geral é interessante, é claro, quando o ArrayCopy é mais lento do que uma simples cópia. Se você precisar alocar memória, você terá que fazê-lo de qualquer maneira, não importa como você o faça.

 
Ilya Malev:

Em nosso exemplo atual, a cópia é feita para uma matriz estática, mas em geral é interessante, é claro, quando o ArrayCopy é mais lento do que simples. Se precisarmos alocar memória, teremos que fazê-lo de qualquer forma.

Não importa estática ou dinâmica, não sabemos como o ArrayCopy() é implementado, apenas assumi que é um "invólucro" sobre funções Cish padrão, memmove() normalmente funciona através de buffer adicional... bem, como sempre, é assim que foi escrito antes, é difícil dizer como e qual compilador funciona

SZY: Eu simplesmente não sei como testar o tempo de execução em MQL ((( - Já tentei algumas vezes, acho que tirei exemplos de ajuda, os resultados são de alguma forma muito diferentes, e ignorei esta questão por necessidade - eu não testei o desempenho, eu geralmente procuro no perfilador, o que e como é executado no tempo

 
Igor Makanu:

Eu simplesmente não sei como testar a velocidade de execução em MQL ((( - Eu tentei algumas vezes, acho que tirei exemplos da ajuda, mas os resultados foram muito diferentes por alguma razão, então eu desisti deste assunto porque eu não testei o desempenho, eu geralmente uso o perfilador para ver como e o que é executado no tempo

aqui está a maneira mais fácil, que eu usei acima

#property strict

#define    test(M,S,EX)        {uint mss=GetTickCount();int nn=(int)pow(10,M);for(int tst=0;tst<nn;tst++){EX;} \
                                printf("%s: loops=%i ms=%u",S,nn,GetTickCount()-mss);}

void OnStart()
 {
  int arr1[100]={0},arr2[100]={0};
  test(7,"Копирование через ArrayCopy",ArrayCopy(arr1,arr2))
  test(7,"Копирование через for",for(int i=0;i<100;i++)arr1[i]=arr2[i])
 }  


 
Ilya Malev:

aqui está a maneira mais fácil que usei acima


Obrigado, entendi, vou testá-lo amanhã.

 
Ilya Malev:

Sim, isto funcionará muito mais rápido (substituído, quando possível, pelo ArrayCopy, o resto é o mesmo):

Eu lhe disse, escrevi a primeira coisa que me veio à mente sem nenhum teste))

Esta variante não é diferente da minha. As medidas (tempo mínimo em 10 tentativas) comprovam isso.

https://www.mql5.com/ru/forum/287618/page14#comment_9807465
TicksToIntArray_fxsaber2
Time[TicksToIntArray(TicksIn,Array)] = 301036
IntArrayToTicks_fxsaber2
Time[IntArrayToTicks(Array,TicksOut)] = 315109
true

https://www.mql5.com/ru/forum/287618/page14#comment_9808274
TicksToIntArray_antfx1
Time[TicksToIntArray(TicksIn,Array)] = 216101
IntArrayToTicks_antfx1
Time[IntArrayToTicks(Array,TicksOut)] = 203610
true

https://www.mql5.com/ru/forum/287618/page14#comment_9810247
TicksToIntArray_antfx2
Time[TicksToIntArray(TicksIn,Array)] = 303656
IntArrayToTicks_antfx2
Time[IntArrayToTicks(Array,TicksOut)] = 312008
true

Você pode ver que a variante com ciclo é mais rápida, porque o ciclo de 60 /4 = 15 elementos.

Arquivos anexados:
 
fxsaber:

Esta variante não é diferente da minha.

Aparentemente sim, apenas o tipo de estrutura e o tipo de matriz são arbitrários.

 
fxsaber:

Pode-se ver que a variante de loop é mais rápida, porque o loop de 60 /4 = 15 elementos.

Estranhamente, fiquei mais rápido que o ArrayCopy com os mesmos MqlTicks e int...

 
Ilya Malev:

Estranhamente, fiquei mais rápido que o ArrayCopy com os mesmos MqlTicks e int...

Estou executando-o em MT5x64.

Ilya Malev:

Aparentemente, sim, mas o tipo de estrutura e o tipo de matriz são arbitrários.

Evitei propositadamente o caso comum para permitir a participação de mais pessoas.


Até agora

https://www.mql5.com/ru/forum/287618/page14#comment_9808274
TicksToIntArray_antfx1
Time[TicksToIntArray(TicksIn,Array)] = 213426
IntArrayToTicks_antfx1
Time[IntArrayToTicks(Array,TicksOut)] = 202693
true

https://www.mql5.com/ru/forum/287618/page14#comment_9807465
TicksToIntArray_fxsaber3
Time[TicksToIntArray(TicksIn,Array)] = 192362
IntArrayToTicks_fxsaber3
Time[IntArrayToTicks(Array,TicksOut)] = 159932
true
 
fxsaber:

Funcionando em MT5x64.

Puramente contornou o caso geral para que mais pessoas pudessem participar.


Até o momento.

Acho que seu código já é mais rápido :)

Tenho que adicionar muito código de serviço lá para melhorar a funcionalidade do ArrayCopy (início da fonte, início do destino, contagem) e verificar os parâmetros para a exatidão...

Em geral, você tem tantas obras/libris legais que é estranho que você pergunte e discuta a melhor solução no fórum :)

 
Ilya Malev:

É estranho que você pergunte e discuta a melhor solução no fórum :)

Preciso de uma para a biblioteca HistoryTicks. Obrigado por participar.

Razão: