Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se
A implantação de funções normais é auto-explicativa
i.e. por exemplo para (int i=0; i<ArraiSize(max); i++)
aqui ArraiSize(max); será expandido e obterá algo como endereço para o tamanho de determinado array (se olharmos para array, ele tem seu tamanho em uma variável, e aqui temos a substituição desta variável "endereço na memória"), ou seja, não faz sentido mudá-lo para uma variável, de forma alguma
para (int i=0; i<ArraiSize(max); i++)
и
para (int i=0; i<tamanho; i++ )
Neste caso ArraiSize(max) e tamanho têm os mesmos tempos para determinar o tamanho da matriz
declaração incorreta
testado: experimentei 1000 vezes, 3 matrizes e 3 loops aninhados em cada matriz, 2 variantes: a 1ª e a 2ª
o resultado é estável (testado 3 vezes):
2020.11.02 21:17:25.952 SpeedTst (EURUSD,H1) ArraySize: loops = 1000 segundos=114.5013
2020.11.02 21:17:40.713 SpeedTst (EURUSD,H1) cnt: loops = 1000 segundos=99.7722
Neste loop de exemplo, acho que não concordo com os horários.
Pelo contrário, recomenda-se obter o resultado em variável de tamanho e utilizá-lo na condição.
Uma vez que o loop a cada iteração para oArraiSize(max) se desenrolará desnecessariamente, retardando a execução do loop.
A função ArraiSize(max) expande e retorna a célula com o registro do comprimento da matriz;o endereço da célula onde o comprimento da matriz é armazenado é retornado
e o que é qualquer variável, neste caso o tamanho - é o endereço dacélula onde o comprimento da matriz é armazenado
Assim, obtemos a mesma coisa na saída e mesmo que mudemos o tamanho da matriz no processo do loop, o endereço por célula não mudará nem no primeiro nem no segundo caso.
Uma vez que o valor de massa é sempre estático (não é uma referência), simplesmente não pode haver nenhuma outra lógica)))
A própria função ArraiSize(max), diz que uma seção de memória na matrizmáxima deve ser usada para o comprimento da matriz; isto é realizado no estágio de compilação - implantação da função
declaração incorreta
testado: medição 1000 vezes, 3 matrizes e 3 laços de força bruta aninhados em cada matriz, 2 variantes: 1ª e 2ª
o resultado é estável (testado 3 vezes):
2020.11.02 21:17:25.952 SpeedTst (EURUSD,H1) ArraySize: loops = 1000 segundos=114.5013
2020.11.02 21:17:40.713 SpeedTst (EURUSD,H1) cnt: loops = 1000 segundos=99.7722
então alguns problemas com a build....
então há alguns problemas com a montagem....
É claro que a produção é a mesma.
Mas esta seção de memória será acessada de forma diferente, esse era o objetivo.
O acesso a uma variável é mais rápido que a uma função, uma vez que a variável já contém o valor.
E uma função ainda precisa recuperar este valor e devolvê-lo, ou seja, referir-se a uma célula de memória, uma instrução desnecessária.
O exemplo de Igor é apenas uma confirmação do que eu estava dizendo.
então alguns problemas com a montagem....
mentiu
ArraySize() é chamado em cada iteração
mesmo que você não verifique o tamanho da matriz cada vez, você ainda recebe uma chamada de procedimento e pelo menos uma verificação da variável que armazena o tamanho da matriz
Este é o teste sobre o qual estou escrevendo, redimensionamos a matriz no loop, o loop é interrompido como deveria ser, ou seja, a cada iteração do loop o tamanho da matriz é determinado depois que o corpo do loop é executado:
mentiu
ArraySize() é chamado em cada iteração
mesmo que o tamanho da matriz não seja verificado sempre, o procedimento ainda é chamado e pelo menos a variável que armazena o tamanho da matriz é verificada
Aqui está o teste sobre o qual estou escrevendo, mudando o tamanho da matriz no loop, o loop foi terminado como esperado, ou seja, a cada iteração do loop o tamanho da matriz foi definido depois que o corpo do loop foi executado:
Dê-me o código completo do seu teste.
É claro que conseguimos o mesmo na produção.
Mas este fragmento de memória será buscado de forma diferente, é isso que quero dizer.
O exemplo de Igor é apenas uma confirmação do que eu estava dizendo.
E você mesmo conduziu o teste, eu estou no 110000000000000000000 algo assim não acontece.
A função ArraiSize(max) é expandida, ela pega uma célula com o registro do comprimento da matriz e a devolve,o endereço da célula onde o comprimento da matriz é registrado
e o que é qualquer variável, neste caso o tamanho - é o endereço dacélula onde o comprimento da matriz é armazenado
Assim, obtemos a mesma coisa na saída e mesmo que mudemos o tamanho da matriz no processo do loop, o endereço por célula não mudará nem no primeiro nem no segundo caso.
Uma vez que o valor de massa é sempre estático (não é uma referência), simplesmente não pode haver nenhuma outra lógica)))
A própria função ArraiSize(max) diz que devemos usar uma área de memória na matrizmáxima responsável pelo comprimento da matriz e isso é executado na fase de compilação - implantação da função
Esta opinião parece ser prematura. O que acontece exatamente por trás da função ArraiSize é desconhecido, não é mesmo? É uma caixa preta em MQL. É bem possível que para (int i=0; i<ArraiSize(max); i++) leve à execução de várias instruções. Por exemplo, uma função pode verificar os parâmetros de entrada. Salvar - empurrar os dados para fora da pilha. Salvar registros. Restauração de registros. Chamada de função - chamar, depois retornar. O que quero dizer é que muita coisa pode estar acontecendo em segundo plano e não podemos vê-la. É por isso que é melhor usar para (int i=0; i<size; i++) e não depender do compilador para fazer o que esperamos que ele faça.
Você mesmo fez o teste, eu não o tenho no 1100000000000000000000000
Foi testado há muito tempo, por isso só utilizo variáveis em loops.
Isto foi testado há muito tempo, então eu só uso variáveis em loops.
Mostre-me um teste com o código
Mostre-me o teste de código
Que teste? ))
Você mesmo mostrou as duas variantes da condição do laço.
Igor também deu o código acima.
Basta medir a execução do laço com a variável de tamanho e com o ArraySize() na condição de laço.