Erros, bugs, perguntas - página 2880

 
Igor Makanu:

não

se houver secções de código repetitivo, terá testes de optimização!

Que diferença faz quanto tempo rand() é executado?

Que seja executado 2/3 do tempo de teste, o principal é fazer o rand() tempo constante

O seu código MQL irá utilizar as funções do sistema MQL, certo? - qual é o objectivo de testar um código perfeito?

)) a diferença de velocidade poderia ser 4 vezes a favor de um dos métodos (1 a 4), mas como a operação rand é 10 vezes mais lenta do que o resto do código, esta diferença não seria visível (11 a 14)

 
Alexandr Andreev:

)) A diferença de velocidade poderia ter sido 4 vezes a favor de um dos métodos (1 a 4), mas como a operação rand 10 vezes mais longa do que o resto do código, esta diferença não teria sido visível (11 a 14)

não, não poderia

a diferença é imediatamente visível

vamos verificar algo anunciado nas inovações, eles escrevem frequentemente que o tempo de acesso às séries de tempos para alguma função foi optimizado = não verificado durante muito tempo

#define    SpeedTest(count_x10,msg,EX)        {ulong mss=GetMicrosecondCount(); ulong count=(ulong)pow(10,count_x10);for(ulong _i=0;_i<count&&!_StopFlag;_i++){EX;} \
//+------------------------------------------------------------------+
void OnStart()
{
   double sum1 = 0.0;
   SpeedTest(7, "tst 1 : ",
   {
      sum1 += iOpen(NULL, 0, rand());
   });
//--
   double sum2 = 0.0;
   SpeedTest(7, "tst 2 : ",
   {
      double o[];
      CopyOpen(NULL, 0, rand(), 1, o);
      sum2 += o[0];
   });
   Print(sum1, " : ", sum2);
}
//+------------------------------------------------------------------+

2020.10.16 02:11:20.671 SpeedTst (EURUSD,H1) tst 1 : : loops=10000000 ms=353174

2020.10.16 02:11:21.967 SpeedTst (EURUSD,H1) tst 2 : : : loops=10000000 ms=1296043

2020.10.16 02:11:21.967 SpeedTst (EURUSD,H1) 11304533.15558525 : 11303930.69247558

2020.10.16 02:11:44.012 SpeedTst (EURUSD,H1) tst 1 : : loops=10000000 ms=359757

2020.10.16 02:11:45.369 SpeedTst (EURUSD,H1) tst 2 : : : loops=10000000 ms=1357325

2020.10.16 02:11:45.369 SpeedTst (EURUSD,H1) 11304350.05612442 : 11304321.21848488

 
Igor Makanu:

não é nada crítico

rand() o tempo de execução é constante, muito provavelmente é uma função C++ comum, google "rand c++ source code".

deve inicializá-lo, mas se o inicializar com constantes pode encontrar optimização

em geral, não compreendo a antipatia do rand()

uma opção é inicializar com algo como isto:

seria rápido.


correu o seu guião, imho não está correcto.

O tempo principal é carregar o código na cache e depois no processador

e acrescentar a discrição do temporizador do sistema

obtemos... quase um número aleatório.

precisa de o testar durante muito tempo, cerca de 100500 vezes, imho

rand() silencia o resultado.
No meu computador, uma iteração de loop demora cerca de 1,5 nanossegundos.

Com dois rand(), uma iteração leva o dobro do tempo - até quase 3 nanossegundos. Deveria perceber que nesta iteração dois acessos a um item de uma grande variedade irão desaparecer, o que também é bastante caro.
Isto significa que cerca de 2/3 de todo o tempo de iteração é gasto em dois rands(). Claro que fiquei um pouco excitado com "por uma ordem de grandeza")

Não compreendo como é que se pode entrar em optimização quando um array pré-preparado é preenchido com números aleatórios.

Já foi discutido uma vez o desempenho em rand(). Tentei até escrever eu próprio uma função semelhante.https://www.mql5.com/ru/forum/170952/page137#comment_12010041

#define  Num 10000000
#define  SpeedTest(msg,s,EX)  {ulong mss=GetMicrosecondCount(); EX \
                                    mss=GetMicrosecondCount()-mss;\
                                    printf("%-30s%llu µs; Сумма - %llu",msg,mss,s);}
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   ulong sum = 0;
   ushort in[];
   ArrayResize(in,Num*2);
   for (int i=0; i<Num*2; i++) in[i] = (ushort)rand();
   SpeedTest("test binary shift : ", sum,
   for (int i =0; i<(2*Num-1);i+=2)
   {
      sum+=in[i]<<(sizeof(ushort)*8) | in[i+1];
   });
//+------------------------------------------------------------------+ 
   sum = 0;
   union ushortTouint
   {
      uint param;
      ushort in[2];
   } u;
   SpeedTest("test union : ", sum,
   for (int i =0; i<(2*Num-1);i+=2)
   {
      u.in[0]=in[i+1];
      u.in[1]=in[i];
      sum+=u.param;
   });
//+------------------------------------------------------------------+   
   sum=0;
   SpeedTest("test binary shift + rand() : ", sum,
   for (int i =0; i<(2*Num-1);i+=2)
   {
      sum+=(ushort)rand()<<(sizeof(ushort)*8) | (ushort)rand();
   });
//+------------------------------------------------------------------+  
   sum = 0;
   SpeedTest("test union + rand() : ", sum,
   for (int i =0; i<(2*Num-1);i+=2)
   {
      u.in[0]=(ushort)rand();
      u.in[1]=(ushort)rand();
      sum+=u.param;
   });
}

resultado

2020.10.15 18:30:34.752 TestMakanu (USDCAD,M1)  test binary shift :           13474 µs; Сумма - 10736778112806491
2020.10.15 18:30:34.763 TestMakanu (USDCAD,M1)  test union :                  10189 µs; Сумма - 10736778112806491
2020.10.15 18:30:34.792 TestMakanu (USDCAD,M1)  test binary shift + rand() :  29103 µs; Сумма - 10741215942967312
2020.10.15 18:30:34.820 TestMakanu (USDCAD,M1)  test union + rand() :         28125 µs; Сумма - 10737655794873175
2020.10.15 18:30:37.802 TestMakanu (USDCAD,M1)  test binary shift :           11144 µs; Сумма - 10739125609966082
2020.10.15 18:30:37.812 TestMakanu (USDCAD,M1)  test union :                  10334 µs; Сумма - 10739125609966082
2020.10.15 18:30:37.840 TestMakanu (USDCAD,M1)  test binary shift + rand() :  27495 µs; Сумма - 10739749025492645
2020.10.15 18:30:37.867 TestMakanu (USDCAD,M1)  test union + rand() :         26782 µs; Сумма - 10738717766184542
2020.10.15 18:30:40.356 TestMakanu (USDCAD,M1)  test binary shift :           10618 µs; Сумма - 10738510882058397
2020.10.15 18:30:40.367 TestMakanu (USDCAD,M1)  test union :                  11354 µs; Сумма - 10738510882058397
2020.10.15 18:30:40.395 TestMakanu (USDCAD,M1)  test binary shift + rand() :  27637 µs; Сумма - 10738670876702722
2020.10.15 18:30:40.422 TestMakanu (USDCAD,M1)  test union + rand() :         26772 µs; Сумма - 10737441784096963
 

Penso que o resultado final é que quase não faz diferença se se usa o turno sindical ou binário.
Utilizo estes dois métodos na minha biblioteca iCanvas para trabalhar com cor.

union argb {
   uint clr;
   uchar c[4];
};


Lembro-me, também tenho feito alguns testes de desempenho, e concluí que quase não faz diferença. Mas o código com união é mais legível.
Devo admitir que fiquei desapontado porque esperava obter um ganho de desempenho notável com a união.

 
Nikolai Semko:

Não compreendo como é que se pode entrar em optimização quando um conjunto pré-preparado é preenchido com números aleatórios.

Dei-lhe 2 ligações no hubr acima, o primeiro artigo mostra bem o aspecto de um loop normal após a compilação

Não estou a dizer que tem necessariamente de conseguir a optimização em tempo de execução, mas imho, se o array não mudar, que é essencialmente um espaço de memória constante com um tamanho constante para o loop, não é um facto que a optimização não irá aparecer em algum tipo de processador, e a optimização pode ser esperada do compilador, bem como do processador com um cache


Nikolai Semko:

Penso que o resultado final é que quase não faz diferença o que usar - sindicato ou turno binário.

Sim, isso mesmo, vou usar shift, o código é legível, e não há necessidade de introduzir um novo tipo de dados - sindicato
 
Igor Makanu:

Dei-lhe 2 links no hbr acima, o primeiro artigo mostra bem como um loop normal se comporta após a compilação

Não estou a dizer que tem de se conseguir optimizar o tempo de execução, mas imho, se a matriz não mudar, que é essencialmente um espaço de memória constante com um tamanho constante para o loop, não é certo que não surja nenhuma optimização

A julgar pelos resultados, não há sinais de optimização

 
Nikolai Semko:

Os resultados não dão de modo algum a impressão de optimização

sim

O argumento não é sobre um código específico

mas na metodologia de teste, mantenho-me fiel ao que tento optimamente, e rand() embora introduza distorções, mas é um coeficiente linear, não proporcional, ou seja, a precisão não é muito importante se não houver diferença na velocidade inferior a 5%, imho

 
Caros Senhores, pode alguém pelo menos dar-me uma resposta a esta situação que eu não compreenda?
 

Olá a todos!

Tenho uma pergunta, talvez para os criadores da MQL5? Talvez outra pessoa saiba... Existem planos para integrar o compilador/codificador ME com alguns ambientes de desenvolvimento populares como IDEA ou Visual Studio? O Meta Editor é uma grande dor para mim. Sem colapso de blocos, sem modelos de auto-substituição (por exemplo, quando começa a escrever para(...) oferece-lhe imediatamente a substituição de um padrão de laço e muitas outras coisas), sem destaque de várias partes importantes do código. E assim por diante e coisas do género. Não estou a dizer que os robôs modernos são complicados, estes são grandes projectos e há exigências muito mais sérias à gestão de códigos e às capacidades de desenvolvimento de equipas.

Já ninguém escreve os seus próprios editores e compiladores - todos eles os abandonam e avançam para soluções prontas da Microsoft, JetBrains e outros. Todos os editores modernos têm sistemas de plugins personalizáveis que lhe permitem acrescentar o que quiser a eles. A tarefa não é difícil em princípio.

 
Сергей Таболин:
Caros Senhores, há alguém que me possa dar uma resposta a esta situação que eu não compreenda?

E deve intimidar ainda mais os programadores. Então terá ajuda com certeza.