pergunta para #define experts - página 8

 
void OnStart()
  {
   int mas[];
   int mas1[300];
   int mas2[300];
   int mas3[300];
   int mas4[300];
   int mas5[300];
   int mas6[300];
   int z=300;
   int size=100000000;
   ArrayResize(mas,size);
   ulong r=0;
   ulong r1=0;
   ulong r2=0;
   int random;
   ulong max=100; 
   int t=0;
   int tr=0; 
   MathSrand(10);
    int num_steps=ArraySize(mas);
    double x, pi, sum=0.0;
    double step = 1.0/(double)num_steps;
    
     int v=size;
    ulong t1 = GetMicrosecondCount();
     
    
  // for(ulong z=0; z<max; z++)
     {
      for(ulong i=0; i<ArraySize(mas); i++)
        { 
        r2+=ArraySize(mas);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2=r2/10;
        }

     }  
   ulong t2=GetMicrosecondCount();
   //for(ulong z=0; z<max; z++)
     {
      for(ulong i=0; i<v; i++)
        { 
        r1+=v;
        r1=r1/10;
        }
     }
   
   int pi2 = sum*step;
   ulong t3=GetMicrosecondCount();
   Print(t2-t1,"  ",t3-t2," ",r," ",r1," ",r2," ",pi," ",pi2);
// Templ();
  }

Mesmo assim, o código superior às vezes vence, mas muito raramente, ou seja, o link é livre.

 
Alexandr Andreev:

) bem, não é assim que funciona)


É assim que funciona em C++
Em mql acho que é o mesmo, mas com invólucros adicionais da MQ


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

FAQ de Iniciantes MQL5 MT5 MetaTrader 5

Roman, 2019.12.11 14:02

Você não tem que pensar bem, por que eu deveria... O compilador fará tudo sozinho. ))
C# não é C

Dê uma olhada no vídeo sobre __em linha.
Explica ali como funcionam as funções em memória daqueles que não fazem nenhuma diferença.


 
Roman:

É assim que funciona em C++
Em mql penso o mesmo, mas com invólucros adicionais da MQ

Bem, agora releia este tópico e muitas declarações e exemplos de testes - que há alguma diferença. E nós o encontramos))))

 
Alexandr Andreev:

Bem, agora releia este tópico e um monte de declarações e exemplos de testes - que há uma diferença. E eles fizeram))))

Não )) Não tenho desejo de relê-lo.
É óbvio para mim que existe uma diferença.

 
Roman:

Não )) Não tenho vontade de relê-lo.
É óbvio para mim que existe uma diferença.

)))) outro IMHO.

 
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
   int mas[];
   int mas1[300];
   int mas2[300];
   int mas3[300];
   int mas4[300];
   int mas5[300];
   int mas6[300];
   int z=300;
   int size=1000000000;
   ArrayResize(mas,size);
   ulong r=0;
   ulong r1=0;
   ulong r2=0;
   int random;
   ulong max=100; 
   int t=0;
   int tr=0; 
   MathSrand(10);
    int num_steps=ArraySize(mas);
    double x, pi, sum=0.0;
    double step = 1.0/(double)num_steps;
    
     int v=size;
    ulong t1 = GetMicrosecondCount();
     
    
  // for(ulong z=0; z<max; z++)
     {
      for(int i=0; i<ArraySize(mas); i++)
        { 
        r2+=ArraySize(mas);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1); 
        r2++;
        r2=r2/100;
        }

     }  
   ulong t2=GetMicrosecondCount();
   //for(ulong z=0; z<max; z++)
   int sizem=ArraySize(mas);
     {
      for(int i=0; i<sizem; i++)
        { 
        r1++;
        r1=r1/100;
        r1++;
        
        }
     }
    
   ulong t3=GetMicrosecondCount();
   Print(t2-t1,"  ",t3-t2," ",r2," ",r1);
// Templ();
  }

//+------------------------------------------------------------------+
//|                                           
  
void Funk(ulong &a){a++;}
void FunkRand(ulong &a){a+=rand();}

//+------------------------------------------------------------------+

A via superior é mais rápida em quase 15% isso é muito significativo, bem, se tudo é tão óbvio me explique isso)


 
Alexandr Andreev:

)))) outra IMHO

O caminho superior é mais rápido em quase 20%, bem, já que tudo é tão óbvio me explica isso)


Os laços que estão sendo comparados não são os mesmos em termos de código no corpo.
O primeiro laço tem um código no corpo, o segundo laço no corpo tem outro código.
Instruções de código naturalmente diferentes, tempo de execução naturalmente diferente.
Faça o mesmo código no corpo do loop e mude somente a condição do loop ArraySize e a variável de tamanho.
Estamos testando esta parte, não o corpo.

 
Roman:

Os loops que estão sendo comparados não são o mesmo código no corpo.
O primeiro laço tem um código em seu corpo e o segundo laço tem outro código.
Naturalmente, instruções de código e tempo de execução diferentes são diferentes.
Faça o mesmo código no corpo do loop e mude somente a condição do loop ArraySize e a variável de tamanho.
Estamos testando esta parte, não o corpo.

Seu teste é mais incorreto porque depende do caso de lançamento, execute-o novamente. Aqui, em ambos os casos, há um incremento e uma divisão. Bem, além disso, há um par de dezenas extras ~ bilhões de chamadas ArraySize no topo.

A propósito, é no corpo que devemos escrever o que estamos testando. Porque é o corpo que se repete. Estamos tentando embrulhá-lo em loop.... para obter um resultado ou seja, era originalmente necessáriochamar o ArraySize do corpo

Документация по MQL5: Операции с массивами / ArraySize
Документация по MQL5: Операции с массивами / ArraySize
  • www.mql5.com
"Нулевое измерение = Размер массива / (Первое измерение * Второе измерение * Третье измерение)"
 
Alexandr Andreev:

Seu teste é mais incorreto, pois depende do caso de lançamento, execute-o novamente. Aqui ambos os casos têm incremento e uma divisão. Bem, além disso, há um par de dezenas~ bilhões de chamadas ArraySize em cima dele.

A propósito, é no corpo que devemos escrever o que estamos testando. Porque é o corpo que se repete. Estamos tentando embrulhá-lo em loop.... para obter um resultado ou seja, foi inicialmente necessáriochamar o ArraySize do corpo

A cada iteração, a condição do laço já contém uma verificação da condição i<ArraySize() ou i<size
, ou seja, a cada iteração, uma função ou uma variável é chamada.
Por que devemos colocar o objeto a ser testado no corpo?

A própria lógica nos leva a decidir qual deles será mais rápido de se lidar. A uma função ou a uma variável.
Não me interessa o que o compilador lhe chama. Não estou confiando no compilador, estou apenas usando meu bom senso para descobrir o que é mais rápido de se lidar do ponto de vista de referência.

 
Roman:

A cada iteração, na condição do loop, a condição i<ArraySize() ou i<size
é verificada de qualquer forma, o que significa que a cada iteração é chamada uma função ou uma variável.
Por que devemos colocar o objeto a ser testado no corpo?

Porque nós somos os sortudos que têm esta função e a função pode ser qualquer outra. E é colocado exatamente no corpo. Eu só o dupliquei na tentativa de melhorar seu efeito e abordar diferentes matrizes.

Mas é errado acrescentar tarefas mais complexas, cujo erro de cálculo pode ofuscar o efeito em estudo. A propósito, também é possível que a montagem não seja constante em μl. Ou seja, quando a recompilação pode obter dados ligeiramente diferentes (embora isto não seja exato, mas é meio que usado como proteção contra hacking), então tudo pode ser testado em seu código para você também. Veja se os resultados mudam.

Mcl simplesmente tenta substituir o código como indicado no vídeo. Bem, lá é um pouco diferente. Mas em termos gerais.

E aquelas instruções de funções que não sabem que valor terão - é assim que js e php e outros idiomas semelhantes funcionam, mesmo µl funciona desta forma, mas apenas em modo de depuração

Документация по MQL5: Константы, перечисления и структуры / Состояние окружения / Информация о запущенной MQL5-программе
Документация по MQL5: Константы, перечисления и структуры / Состояние окружения / Информация о запущенной MQL5-программе
  • www.mql5.com
Информация о запущенной MQL5-программе - Состояние окружения - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Roman:

A cada iteração, na condição de loop, a condição i<ArraySize() ou i<size
é verificada de qualquer forma, o que significa que a cada iteração, uma função ou uma variável é acessada.
Por que devemos colocar o objeto a ser testado no corpo?

A própria lógica nos leva a decidir qual deles será mais rápido de se lidar. A uma função ou a uma variável.
Não me interessa o que o compilador lhe chama. Eu não confio no compilador, confio no bom senso e descubro o que é mais rápido de se lidar do ponto de vista da referência.

Nem sempre funciona.

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

Pergunta para #define experts

Romano, 2020.11.02 19:44

Mudei meu posto.
É o contrário, ou seja, o ArraySize é mais rápido agora do que o cnt.
Era o inverso antes. Talvez o cnt de incremento - afeta, o corpo do laço é diferente e provavelmente algo mais deve ser inventado para a carga.

void OnStart()
{
   int arr[];
   int sz = ArrayResize(arr, 100000000);  
   
   ulong t = GetMicrosecondCount();
   
   for(int i=0; i < ArraySize(arr); i++) 
   {
      ArrayResize(arr, sz--); //какая то нагрузка
   }   
   
   t = GetMicrosecondCount() - t;
   
   PrintFormat("Total time: %.3f ms", t / 1000.0);
}
2020.11.02 21:33:22.863 TestScript (USDJPY,M1)  Total time: 451.200 ms


void OnStart()
{
   int arr[];
   int sz = ArrayResize(arr, 100000000);  
   int cnt = ArraySize(arr);
   
   ulong t = GetMicrosecondCount();
   
   for(int i=0; i < cnt; i++) 
   {
      ArrayResize(arr, sz--);
      cnt--;
   }
      
   t = GetMicrosecondCount() - t;
   
   PrintFormat("Total time: %.3f ms", t / 1000.0);
}
2020.11.02 21:56:26.591 TestScript (USDJPY,M1)  Total time: 531.872 ms

Razão: