Perguntas sobre OOP em MQL5 - página 69

 
fxsaber:
Tenho um resultado inesperado.


imho, os testes não são comparáveis

A STRUCT2 tem um construtor

A STRUCT2 tem cordas

não há documentação sobre as cordas como implementadas na MQL, discutimoshttps://www.mql5.com/ru/forum/1111/page2732#comment_16181920


isto é, em seu teste, STRUCT2 funciona como uma classe com um construtor, que tem uma "classe string" com um construtor, que está de fato alocando memória para o objeto várias vezes

Eu acho que um teste tão complexo deve ser dividido em vários testes - o tempo de criação das estruturas STRUCT1 e STRUCT2 e depois o tempo de acesso aos dados. Alguns desenvolvedores escreveram que a string é alocada memória somente após acessar a string - em seu exemplo, a string é inicializada por uma string constante, então é difícil ver como ela é inicializada - o compilador pode não inicializar (ou alocar memória?) as strings antes de acessá-las

 
Igor Makanu:

Eu acho que um teste tão complexo deveria ser dividido em vários testes

Não quero nem me incomodar. Eu fiz estruturas simples.

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

// Простая структура.
struct STRUCT1
{
  int i;
  double j[2];
};

// Простая структура большего размера.
struct STRUCT3
{
  int i;
  double j[10];
};

template <typename T>
int Func( T &Array[] )
{  
  // Write
  for (int i = ArraySize(Array) - 1; i >= 0; i--)
    Array[i].i = i;

  int Sum = 0;
  
  // Read
  for (int i = ArraySize(Array) - 1; i >= 0; i--)
    Sum += Array[i].i;
    
  return(Sum + ArraySize(Array));    
}

#include <Debug.mqh>

void OnStart()
{
  STRUCT1 Array1[]; // Простая структура.
  STRUCT3 Array3[]; // Простая структура большего размера.
  
  const int Amount = 5 e7;
  
  Print(_B(ArrayResize(Array1, Amount), 1));
  Print(_B(ArrayResize(Array3, Amount), 1));
      
  Print(_B(Func(Array1), 1)); // Чтение и запись простой структуры
  Print(_B(Func(Array3), 1)); // зависит от ее размеров.
  
  _P2(sizeof(STRUCT1));
  _P2(sizeof(STRUCT3));
}


        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


Por que razão o acesso ao primeiro campo de uma estrutura simples depende de seu tamanho - não é claro.

 
fxsaber:

Eu não quero nem me incomodar. Eu fiz estruturas simples.



Por que razão o acesso ao primeiro campo de uma estrutura simples depende de seu tamanho - não é claro.

É melhor fazer esta pergunta aos desenvolvedores do ramo correspondente. Com código de teste. Ou eles o explicarão, ou o consertarão, ou não dirão nada... Só a terceira variante provavelmente funcionará aqui.

 
Artyom Trishkin:

Esta é uma questão que melhor se coloca aos desenvolvedores do ramo em questão. Com o código de teste. Ou o explicarão, ou o consertarão, ou não dirão nada... Aqui provavelmente é apenas a terceira opção.

Meu MT5 começou a causar demasiada profanação. Existem bugs críticos. Isso é uma besteira.

 
fxsaber:

Eu não quero nem me incomodar. Eu fiz estruturas simples.

agora os mesmos testes STRUCT1 e STRUCT3

fxsaber:

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

Este é apenas um jogo de adivinhação.

outra maneira é esperar que alguém faça o mesmo teste em C++ e exibir os resultados. Se houver uma grande diferença, isso significa que a alocação de memória em MQL está mal implementada

se os testes 1 e 2 são mais ou menos os mesmos, é o Windows que está alocando a memória desta forma

 
fxsaber:

Meu MT5 começou a causar demasiada profanação. Existem bugs críticos. Isso é uma besteira.

É aconselhável reportar todos os bugs. Crítico e não. Sem emoção, é claro :)

 
Igor Makanu:

se os testes 1 e 2 são mais ou menos os mesmos, então é assim que o Windows está alocando memória

realizou o último teste 2 vezes em

Terminal MetaTrader 5 x64 build 2470 iniciado para MetaQuotes Software Corp.

Windows 10 build 18363, Intel Core i3-4170 @ 3.70GHz, 8/11GB de memória, disco 188/297GB, IE 11, UAC, GMT+4

2020.05.30 17:01:27.996 tst_f (EURUSD,H1) Alerta: Tempo[tst_f.mq5 53: ArrayResize(Array1,Amount)] = 1 ms.

2020.05.30 17:01:27.996 tst_f (EURUSD,H1) 50000000

2020.05.30 17:01:28.002 tst_f (EURUSD,H1) Alerta: Tempo[tst_f.mq5 54: ArrayResize(Array3,Montante)] = 6 ms.

2020.05.30 17:01:28.002 tst_f (EURUSD,H1) 50000000

2020.05.30 17:01:28.515 tst_f (EURUSD,H1) Alerta: Tempo[tst_f.mq5 56: Func(Array1)] = 512 ms.

2020.05.30 17:01:28.515 tst_f (EURUSD,H1) 1333106752

2020.05.30 17:01:30.734 tst_f (EURUSD,H1) Alerta: Tempo[tst_f.mq5 57: Func(Array3)] = 2218 ms.

2020.05.30 17:01:30.734 tst_f (EURUSD,H1) 1333106752

2020.05.30 17:01:41.278 tst_f (EURUSD,H1) Alerta: Tempo[tst_f.mq5 53: ArrayResize(Array1,Amount)] = 2 ms.

2020.05.30 17:01:41.278 tst_f (EURUSD,H1) 50000000

2020.05.30 17:01:41.287 tst_f (EURUSD,H1) Alerta: Tempo[tst_f.mq5 54: ArrayResize(Array3,Montante)] = 9 ms.

2020.05.30 17:01:41.287 tst_f (EURUSD,H1) 50000000

2020.05.30 17:01:41.840 tst_f (EURUSD,H1) Alerta: Tempo[tst_f.mq5 56: Func(Array1)] = 552 ms.

2020.05.30 17:01:41.840 tst_f (EURUSD,H1) 1333106752

2020.05.30 17:01:43.728 tst_f (EURUSD,H1) Alerta: Tempo[tst_f.mq5 57: Func(Array3)] = 1888 ms.

2020.05.30 17:01:43.728 tst_f (EURUSD,H1) 1333106752


nem todos os arquivos estão anexados ao roteiro, as últimas linhas não foram compiladas

  //_P2(sizeof(STRUCT1));
//  _P2(sizeof(STRUCT3));

Eu tinha o Debug.mqh includindo


UPD: sobre a construção antiga eu fiz o teste

2020.05.30 17:17:27.604 Terminal MetaTrader 5 - construir 2361



2020.05.30 17:13:17.046 tst (EURUSD,H1) Alerta: Tempo[tst.mq5 53: ArrayResize(Array1,Amount)] = 1 ms.

2020.05.30 17:13:17.047 tst (EURUSD,H1) 50000000

2020.05.30 17:13:17.053 tst (EURUSD,H1) Alerta: Tempo[tst.mq5 54: ArrayResize(Array3,Montante)] = 6 ms.

2020.05.30 17:13:17.053 tst (EURUSD,H1) 50000000

2020.05.30 17:13:17.563 tst (EURUSD,H1) Alerta: Tempo[tst.mq5 56: Func(Array1)] = 510 ms.

2020.05.30 17:13:17.563 tst (EURUSD,H1) 1333106752

2020.05.30 17:13:19.416 tst (EURUSD,H1) Alerta: Tempo[tst.mq5 57: Func(Array3)] = 1852 ms.

2020.05.30 17:13:19.416 tst (EURUSD,H1) 1333106752

2020.05.30 17:13:28.971 tst (EURUSD,H1) Alerta: Tempo[tst.mq5 53: ArrayResize(Array1,Amount)] = 2 ms.

2020.05.30 17:13:28.971 tst (EURUSD,H1) 50000000

2020.05.30 17:13:28.977 tst (EURUSD,H1) Alerta: Tempo[tst.mq5 54: ArrayResize(Array3,Montante)] = 6 ms.

2020.05.30 17:13:28.977 tst (EURUSD,H1) 50000000

2020.05.30 17:13:29.456 tst (EURUSD,H1) Alerta: Tempo[tst.mq5 56: Func(Array1)] = 478 ms.

2020.05.30 17:13:29.456 tst (EURUSD,H1) 1333106752

2020.05.30 17:13:31.192 tst (EURUSD,H1) Alerta: Tempo[tst.mq5 57: Func(Array3)] = 1735 ms.

2020.05.30 17:13:31.192 tst (EURUSD,H1) 1333106752

os resultados são semelhantes - o comportamento é o mesmo
 
Tente trocar seus anúncios. Não depende de qual deles está no topo da pilha?
 
Artyom Trishkin:

Todos os bugs devem ser relatados, de preferência. Crítico ou não. Unemocionalmente, é claro :)

Foram criadas filiais detalhadas.

 
Vladimir Simakov:
Tente trocar os anúncios deles. Não depende de qual deles está no topo da pilha?
void OnStart()
{
  STRUCT3 Array3[]; // Простая структура большего размера.
  STRUCT1 Array1[]; // Простая структура.
  
  
  const int Amount = 5 e7;
  
  Print(_B(ArrayResize(Array3, Amount), 1));
  Print(_B(ArrayResize(Array1, Amount), 1));
  
      
  Print(_B(Func(Array3), 1)); // зависит от ее размеров.
  Print(_B(Func(Array1), 1)); // Чтение и запись простой структуры
  
  //_P2(sizeof(STRUCT1));
//  _P2(sizeof(STRUCT3));
}

2020.05.30 17:33:07.892 tst_f (EURUSD,H1) Alerta: Tempo[tst_f.mq5 54: ArrayResize(Array3,Montante)] = 6 ms.

2020.05.30 17:33:07.955 tst_f (EURUSD,H1) 50000000

2020.05.30 17:33:07.957 tst_f (EURUSD,H1) Alerta: Tempo[tst_f.mq5 55: ArrayResize(Array1,Amount)] = 1 ms.

2020.05.30 17:33:07.957 tst_f (EURUSD,H1) 50000000

2020.05.30 17:33:09.902 tst_f (EURUSD,H1) Alerta: Tempo[tst_f.mq5 58: Func(Array3)] = 1945 ms.

2020.05.30 17:33:09.902 tst_f (EURUSD,H1) 1333106752

2020.05.30 17:33:10.353 tst_f (EURUSD,H1) Alerta: Tempo[tst_f.mq5 59: Func(Array1)] = 450 ms.

2020.05.30 17:33:10.353 tst_f (EURUSD,H1) 1333106752

Não parece fazer nenhuma diferença para mim.
Razão: