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.
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
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);}
voidOnStart()
{
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])
}
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 :)
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.
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
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
aqui está a maneira mais fácil que usei acima
Obrigado, entendi, vou testá-lo amanhã.
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.
Você pode ver que a variante com ciclo é mais rápida, porque o ciclo de 60 /4 = 15 elementos.
Esta variante não é diferente da minha.
Aparentemente sim, apenas o tipo de estrutura e o tipo de matriz são arbitrários.
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...
Estranhamente, fiquei mais rápido que o ArrayCopy com os mesmos MqlTicks e int...
Estou executando-o em MT5x64.
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
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 :)
É estranho que você pergunte e discuta a melhor solução no fórum :)
Preciso de uma para a biblioteca HistoryTicks. Obrigado por participar.