pergunta para #define experts - página 5

 
Alexandr Andreev:

Dê-me o código completo do seu teste

aqui está, mas não vejo nenhum ponto em discutir rand() novamente, alternativamente substitua-o por alguma variável inc++

#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;} \
                                              printf("%s: loops = %llu seconds=%.4f",msg,count,(double)(GetTickCount()-mss)/1000000.0);}



//+------------------------------------------------------------------+
void OnStart()
{
   int arr1[], arr2[], arr3[];
   int cnt1 = ArrayResize(arr1, 100);
   int cnt2 = ArrayResize(arr2, 200);
   int cnt3 = ArrayResize(arr3, 300);
   ulong sum = 0;

   SpeedTest(3,"ArraySize",
      for(int i = 0; i < ArraySize(arr1); i++)
      {
         for(int j = 0; j < ArraySize(arr2); j++)
         {
            for(int k = 0; k < ArraySize(arr3); k++)
            {
               arr3[k] = rand();
               sum += arr3[k];
            }
            arr2[j] = rand();
            sum += arr2[j];
         }
         arr1[i] = rand();
         sum += arr1[i];
      }
   )
   
   SpeedTest(3,"cnt",
      for(int i = 0; i < cnt1; i++)
      {
         for(int j = 0; j < cnt2; j++)
         {
            for(int k = 0; k < cnt3; k++)
            {
               arr3[k] = rand();
               sum += arr3[k];
            }
            arr2[j] = rand();
            sum += arr2[j];
         }
         arr1[i] = rand();
         sum += arr1[i];
      }
   )

}


Sim... Eu tenho um erro no meu código, quero emitir tempo em segundos, mas recebo 10 vezes mais, dividi-o corretamente por 1 000 000, quem pode me dizer qual é a razão?

 
Igor Makanu:

aqui está, mas não vejo a utilidade de discutir novamente o rand(), alternativamente, substituí-lo por alguma variável inc++


Sim... Algum tipo de erro em meu código, eu quero emitir o tempo em segundos, mas recebo 10 vezes mais, dividi corretamente por 1 000 000, quem pode me dizer qual é a razão?

BOMB.

aqui está o seu código que prova que é o contrário.

//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#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;} \
                                              printf("%s: loops = %llu seconds=%.4f",msg,count,(double)(GetTickCount()-mss)/1000000.0);}
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
void OnStart()
{
   int arr1[], arr2[], arr3[];
   int cnt1 = ArrayResize(arr1, 100);
   int cnt2 = ArrayResize(arr2, 200);
   int cnt3 = ArrayResize(arr3, 300);
   ulong sum = 0;

   
   SpeedTest(3,"cnt",
      for(int i = 0; i < cnt1; i++)
      {
         for(int j = 0; j < cnt2; j++)
         {
            for(int k = 0; k < cnt3; k++)
            {
               arr3[k] = rand();
               sum += arr3[k];
            }
            arr2[j] = rand();
            sum += arr2[j];
         }
         arr1[i] = rand();
         sum += arr1[i];
      }
   )

   SpeedTest(3,"ArraySize",
      for(int i = 0; i < ArraySize(arr1); i++)
      {
         for(int j = 0; j < ArraySize(arr2); j++)
         {
            for(int k = 0; k < ArraySize(arr3); k++)
            {
               arr3[k] = rand();
               sum += arr3[k];
            }
            arr2[j] = rand();
            sum += arr2[j];
         }
         arr1[i] = rand();
         sum += arr1[i];
      }
   )
}
 
Alexandr Andreev:

BOMB

Aqui está o seu código que prova o contrário.

Acabei de trocar os cheques.

 
Alexandr Andreev:

Eu só troquei os cheques

2020.11.02 21:01:38.590 22222 (USDCHF,H1) cnt: loops = 1000 segundos=821.7159

2020.11.02 21:01:52.353 22222 (USDCHF,H1) ArraySize: loops = 1000 segundos=807.9415


A partir disso, verifica-se que oArraySize é mais rápido do que usar uma variável =))) algo está errado com o teste
 
Roman:

Que teste? ))
Você mesmo mostrou as duas variações da condição do ciclo.
Igor também deu o código acima.
Basta medir o desempenho do loop com tamanho variável e com o ArraySize() na condição de loop.

Prove que estou errado)

porque em meu teste eles são os mesmos

 
Alexandr Andreev:

Acabei de trocar os cheques.

Sim, você tem que fazer isso.

Desta vez, eu era preguiçoso demais.

Envolveu os testes em um laço externo, conseguiu assim:

2020.11.02 22:06:43.557 SpeedTst (EURUSD,H1) ArraySize: loops = 1000 segundos=117.4626

2020.11.02 22:06:58.328 SpeedTst (EURUSD,H1) cnt: loops = 1000 segundos=102.7337

2020.11.02 22:07:13.075 SpeedTst (EURUSD,H1) ArraySize: loops = 1000 segundos=87.9782

2020.11.02 22:07:27.850 SpeedTst (EURUSD,H1) cnt: loops = 1000 segundos=73.2461

2020.11.02 22:07:42.598 SpeedTst (EURUSD,H1) ArraySize: loops = 1000 segundos=58.4859

2020.11.02 22:07:57.380 SpeedTst (EURUSD,H1) cnt: loops = 1000 segundos=43.7522

2020.11.02 22:08:12.891 SpeedTst (EURUSD,H1) ArraySize: loops = 1000 segundos=28.9861

2020.11.02 22:08:28.874 SpeedTst (EURUSD,H1) cnt: loops = 1000 segundos=13.4910

 
Igor Makanu:

Sim, isso tem que ser feito.

Desta vez, eu era preguiçoso demais.

Envolveu os testes em um laço externo, conseguiu isto

2020.11.02 22:06:43.557 SpeedTst (EURUSD,H1) ArraySize: loops = 1000 segundos=117.4626

2020.11.02 22:06:58.328 SpeedTst (EURUSD,H1) cnt: loops = 1000 segundos=102.7337

2020.11.02 22:07:13.075 SpeedTst (EURUSD,H1) ArraySize: loops = 1000 segundos=87.9782

2020.11.02 22:07:27.850 SpeedTst (EURUSD,H1) cnt: loops = 1000 segundos=73.2461

2020.11.02 22:07:42.598 SpeedTst (EURUSD,H1) ArraySize: loops = 1000 segundos=58.4859

2020.11.02 22:07:57.380 SpeedTst (EURUSD,H1) cnt: loops = 1000 segundos=43.7522

2020.11.02 22:08:12.891 SpeedTst (EURUSD,H1) ArraySize: loops = 1000 segundos=28.9861

2020.11.02 22:08:28.874 SpeedTst (EURUSD,H1) cnt: loops = 1000 segundos=13.4910

Agora troque-os no circuito e fique maravilhado

 
Alexandr Andreev:

Agora troque-os no circuito e você ficará surpreso

Não me surpreenderei. Sei que o compilador pode otimizar o código em tempo real.

mas, imho, em loops aninhados, você ainda não deve chamar o ArraySize() desnecessariamente.

for(int i = ArraySize(arr)-1; i >=0 ; i--)

É claro que às vezes pode ser inconveniente, então eu faço o loop através de uma variável temporária - sua versão № 2

imho, é confiável e você entende o que vai acontecer

 

Bem, eu não posso dizer nada contra o IMHO.

Em replays muito grandes, minhas vitórias se tornaram aleatórias para o primeiro e segundo métodos. Muito provavelmente se tornou dependente do cache atual da CPU e da carga geral.

Minha pergunta não era sobre o loop - era sobre como a função se desdobrava. Assim como um exemplo foi o ArraySize

O resultado;

for (int i=0; i<ArraySIze(mas); i++) == for (int i=0; i<size; i++)


Mas se adicionarmos a inicialização da variável de tamanho à segunda parte, então o primeiro método toma a dianteira para o tempo de inicialização desta variável e a equaciona com o valor.

 

Se você mudar o tamanho das matrizes no corpo do laço, a otimização on-the-fly não funciona

portanto, mude o código:

for(int loop=0; loop <5;loop++)
   {
   int cnt1 = ArrayResize(arr1, 100+loop);
   int cnt2 = ArrayResize(arr2, 200+loop);
   int cnt3 = ArrayResize(arr3, 300+loop);
   
   SpeedTest(3,"cnt",
.....

Alexandr Andreev:

então o primeiro método tem precedência, para o momento de inicializar esta variável e equacioná-la com um valor, ela só é perceptível em altas repetições

não funciona

a otimização do tempo de execução estará na liderança

você não pode testar mashidas tão simples sem o profiler, em geral, você pode escrever em loop, ou você pode testar no testador, a velocidade é importante para isso