pergunta para #define experts - página 4

 
Alexandr Andreev:

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

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

Não vejo qual o sentido de discutir a metodologia de teste - muito longa e necessária
 
Roman:

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

 
Igor Makanu:

declaração incorreta

testado: medição 1000 vezes, 3 matrizes e 3 laços de força bruta aninhados em cada matriz, 2 variantes: e

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

Não vejo qual o sentido de discutir a metodologia de teste - muito longa e necessária

então alguns problemas com a build....

 
Alexandr Andreev:

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.

 
Alexandr Andreev:

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:

void OnStart()
{
   int arr[];
   int sz = ArrayResize(arr, 100000);
   int cnt = 0;
   for(int i = 0; i < ArraySize(arr); i++)
   {
      ArrayResize(arr, sz--);
      cnt++;
   }
   printf("cnt = %i", cnt);   //cnt = 50001
}
 
Igor Makanu:

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.

Roman:

É 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.

Mais precisamente, eu não o tenho em nenhum teste, mesmo em repetiçõesLONG_MAX
 
Alexandr Andreev:

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.

 
Alexandr Andreev:

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.

 
Roman:

Isto foi testado há muito tempo, então eu só uso variáveis em loops.

Mostre-me um teste com o código

 
Alexandr Andreev:

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.

Razão: