Perguntas sobre OOP em MQL5 - página 71

 
Igor Makanu:

se você escrever tais aulas:

a julgar por sua pesquisa, a classe B será mais lenta de executar se você usar campos de estrutura frequentemente nos cálculos?

Então, estávamos discutindo o tempo de atravessar uma série de objetos))))

De acordo com seu exemplo, será o mesmo em pluses, mas em mql há uma nuance, há dois campos implícitos que vão primeiro, portanto, o campo de dados será abordado por turno, ou seja, cálculos adicionais durante o desreferenciamento.

 
Vladimir Simakov:

Então, estávamos discutindo o tempo de travessia da matriz de objetos))))

De acordo com seu exemplo, seria o mesmo em pluses, mas em mql há uma nuance, há dois campos implícitos, que vão primeiro, portanto, o campo de dados será acessado por turno, ou seja, cálculos adicionais durante o desreferenciamento.

Obrigado, isso é útil!

 
Vladimir Simakov:

Então, estávamos discutindo a hora de atravessar a matriz de objetos))))

De acordo com seu exemplo, será o mesmo em pluses, mas em mql há uma nuance: há dois campos implícitos que vão primeiro, portanto o campo de dados será acessado em um offset, ou seja, cálculos adicionais de dereferenciamento serão realizados.

As duas classes são semelhantes. O acesso é por compensação em ambos os casos, apenas não em relação ao início da estrutura, mas em relação ao início da classe. Em outras palavras, a estrutura em si não tem peso. Apenas as classes criam uma sobrecarga.
 
Vladimir Simakov:

Portanto, sem misticismo - as leis da física em ação.

Não se encaixa nas "leis da física".

#include <fxsaber\Benchmark.mqh> // https://c.mql5.com/3/321/Benchmark.mqh

long f1( const int Size, const long Amount = 5 e9 )
{
  long Sum = 0;
  
  for (long i = 0; i < Amount; i++)
  {
    Sum += Size * i;
    
    Sum |= 1;
  }
    
  return(Sum);
}

long f2( const int Size, const long Amount = 5 e9 )
{
  long Sum = 0;
  
  for (long i = 0; i < Amount; i++)
  {
    Sum += Size * (Amount - i);
    
    Sum |= 1;
  }
    
  return(Sum);
}

void OnStart()
{
  Print(_B(f1(2), 1));
  Print(_B(f1(200), 1));
  
  Print(_B(f2(2), 1));
  Print(_B(f2(200), 1));
}


        Alert: Time[Test6.mq5 267: f1(2)] = 3252 ms.
        6553255921290448385
        Alert: Time[Test6.mq5 268: f1(200)] = 4602 ms.
        -8757194524499019775
        Alert: Time[Test6.mq5 270: f2(2)] = 3061 ms.
        6553255931290448385
        Alert: Time[Test6.mq5 271: f2(200)] = 3112 ms.
        -8757193524499019775


Este é um resultado paradoxal. Cálculos mais complexos são realizados 1,5 vezes mais rápido e não dependem do tamanho.

 
Vladimir Simakov:

Então, estávamos discutindo o tempo de travessia da matriz de objetos))))

De acordo com seu exemplo, será o mesmo em pluses, mas há uma nuance em mql - há dois campos implícitos que vão primeiro, portanto o campo de dados será acessado em um offset, ou seja, cálculos adicionais de dereferenciamento serão realizados.

Obrigado a Vladimir pelo estudo do assembler.
E, como Alexey sugere, as despesas gerais são criadas por classes.
A partir disto, podemos concluir que, se você puder prescindir das aulas, é melhor escrever o código em estilo processual.
Isto é, se a tarefa não exigir velocidade, você pode envolvê-la em uma classe, mas se estiver lidando com carrapatos, por exemplo, é melhor usá-la diretamente sem envoltórios.
Em princípio, esta é a abordagem que segui, e muitas vezes encontrando um exemplo de uma classe, desmonto seus métodos na abordagem processual.

 
Roman:

Obrigado Vladimir pelo estudo da montagem.
E, como Alexey sugere, a sobrecarga cria classes.
A partir disto, podemos concluir que, se pudermos prescindir das aulas, é melhor escrever o código em estilo processual.
Isto é, se a tarefa não exigir velocidade, você pode envolvê-la em uma classe, mas se estiver lidando com carrapatos, por exemplo, é melhor usá-la diretamente sem envoltórios.
Em princípio, esta é a abordagem que venho seguindo, e muitas vezes ao encontrar um exemplo de classe, desmonto seus métodos em estilo processual.

Há um troll no fórum...
Eu costumava não entender porque alguns usuários pedem a função ignorar, ah como ela está faltando agora...

 

Fórum sobre comércio, sistemas automatizados de comércio e testes estratégicos

Perguntas OOP em MQL5

fxsaber, 2020.05.30 14:06

Não tenho a menor idéia do que fazer com ele. Eu fiz estruturas simples.

        50000000
        50000000
        Alert: Time[Test6.mq5 280: Func(Array1)] = 312 ms.
        1333106752
        Alert: Time[Test6.mq5 281: Func(Array3)] = 1348 ms.
        1333106752
        : sizeof(STRUCT1) = 20
        : sizeof(STRUCT3) = 84

Não tenho certeza porque o acesso ao primeiro campo de uma estrutura simples depende de seu tamanho.

Você está usando elementos de 50M em uma matriz.
Para estruturas de tamanho 20 e 84 bytes isto é 0,93GB e 3,91GB de dados, respectivamente.
E no quadro do seu cálculo, presumivelmente, toda essa memória passa pelo cache do processador.
E uma explicação muito lógica para estes resultados seria que 0,93 GB de dados seriam baixados da memória para o cache da CPU quatro vezes mais rápido do que os 3,91 GB de dados.

E quanto aos resultados do teste C++?
Porque eu já vi código de montador, mas nenhum resultado de teste, ou eu fiquei mal?
 
Sergey Dzyublik:

Há um troll no fórum...
Eu costumava não entender porque alguns usuários pedem a função ignorar, ah como ela está faltando agora...

Você deve ter cuidado consigo mesmo, e não com os outros.
Não para você e não para você foi a resposta.
Ignorar em silêncio ))

 
Sergey Dzyublik:
Você está usando elementos de 50M em uma matriz.
Para estruturas de 20 e 84 bytes, isso é 0,93GB e 3,91GB de dados, respectivamente.
E como parte de seu cálculo, presumivelmente toda essa memória passa pelo cache do processador.
E uma explicação muito lógica para estes resultados seria que 0,93 GB de dados seriam baixados da memória para o cache da CPU quatro vezes mais rápido do que os 3,91 GB de dados.

E quanto aos resultados do teste C++?
Porque eu já vi código de montador, mas nenhum resultado de teste, ou eu fiquei mal?
Funciona da mesma maneira. É apenas um pouco mais rápido, mas a proporção é a mesma, portanto é hardware.
 
Roman:

Obrigado Vladimir pelo estudo da montagem.
E, como Alexey sugere, a sobrecarga cria classes.
A partir disto, podemos concluir que, se pudermos prescindir das aulas, é melhor escrever o código em estilo processual.
Isto é, se a tarefa não exigir velocidade, você pode envolvê-la em uma classe, mas se estiver lidando com carrapatos, por exemplo, é melhor usá-la diretamente sem envoltórios.
Em princípio, esta é a abordagem que tomo, e muitas vezes encontrando um exemplo de uma classe, desmonto seus métodos em estilo processual.

Você pode usar uma estrutura em vez de uma classe, eles estão bem.