pergunta para #define experts - página 6

 
Igor Makanu:

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:

)))) você também tem que alterar o valor de sua variável de tamanho, portanto o primeiro método nomeado usando o ArraySIze se beneficiará

 
Alexandr Andreev:

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. É que o ArraySize foi usado como um exemplo.

Isso é bom) A perfeição de uma linguagem de alto nível é precisamente quando uma entrada conveniente é tão barata quanto uma entrada de mau gosto, mas inerentemente barata. Pena que nem sempre é assim, e ajuda com um ajudante para novatos nem sempre..... não haveria perguntas)))))

 
Igor Makanu:

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:


não funciona

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

você não pode testar comandos mashin tão simples sem um profiler, ou você pode escrever no laço, ou testar em um testador, a velocidade é importante para isso

Eu não estava falando do loop, mas de como o compilador desdobra as funções......

Deixo você com isso.

 
Alexandr Andreev:

)))) você também pode alterar o valor de sua variável de tamanho, então o primeiro método usando o ArraySIze ganhará

Eu escrevi acima - esse código simples não pode ser testado com medidas simples, há muitos fatores - o código é pequeno - ele caberá no cache do processador, o código deve ser bem dividido no processador em micro-comandos paralelos na tubulação do processador, ou seja, os registros serão rapidamente carregados por pré-busca de dados

e talvez rand() também será armazenado em cache em algum lugar


não sei como testar sem depurador - pelo menos lá você pode ver o tempo de execução das instruções em tatos

 
Alexandr Andreev:

Então prove que estou errado).

Porque em meu teste, por alguma razão, eles são os mesmos.

Mudei meu posto.
Parece-me que o ArraySize agora é mais rápido que a variável cnt.
Anteriormente era o contrário. Talvez o cnt de incremento - está afetando, 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
 
Roman:

Isto é estranho.
O uso do ArraySize(arr) na condição de loop mostra menos tempo do que o uso da variável cnt.
Era o inverso antes. Talvez seja um erro? Não deveria ser assim.

Você não confundiu nada em seu código, quem vai mudar o valor para você?

cnt

mudá-lo para você, como acontece na primeira variante

 
void OnStart()
  {
   int mas[];
   int size=1000000;
   ArrayResize(mas,size);
   ulong r=0;
   ulong r1=0;
   ulong r2=0;
   int random;
   ulong max=100;
   uint t1=GetTickCount();
   int t=0;
   int tr=0; 
   MathSrand(10);
   for(ulong z=0; z<max; z++)
     {
      for(ulong i=0; i<ArraySize(mas); Funk(i))
        { 
         FunkRand(r1); 
         Funk(r);// мы сюда написали вызов еще одной функции чтобы усложить ситуацию
        }
     }
   tr=r;
   uint t2=GetTickCount();
   for(ulong z=0; z<max; z++)
     {
     int v=size;
      for(ulong i=0; i<v; i++)
        { 
         r2+=rand();
         r--;
        }

     }

   uint t3=GetTickCount();
   Print(t2-t1,"  ",t3-t2," ",r," ",r1," ",r2," ",t1," ",tr);
// Templ();
  }

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

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

500p pergunta (sem verificação), qual o caminho mais rápido. ver quantas funções externas são chamadas no método superior

Документация по MQL5: Основы языка / Функции / Описание внешних функций
Документация по MQL5: Основы языка / Функции / Описание внешних функций
  • www.mql5.com
Внешние функции, определенные в другом модуле, должны быть явно описаны. Описание включает в себя тип возвращаемого значения, имя функции и набор входных параметров с их типами. Отсутствие такого описания может привести к ошибкам при компиляции, компоновке или выполнении программы. При описании внешнего объекта используйте ключевое слово С...
 

como uma variante do teste - você também pode inserir apenas matrizes diferentes em cada teste - no meu exemplo arr1,arr2...

i.e. tst1_arr1[],tst1_arr2[] .... e tst2_arr1[],tst2_arr2[]


este seria um teste mais justo.

estou fora, muito perturbador - imho, útil, use-o

 
Igor Makanu:

Eu não sei como testar sem depurador - pelo menos você pode ver o tempo de execução das instruções em ciclos de relógio.

Bem, sim - você não pode passar sem depurador. E na hora do relógio lá...

 
Roman:

Isto é estranho.
O uso do ArraySize(arr) na condição de loop mostra menos tempo do que o uso da variável cnt.
Era o inverso antes. Talvez seja um erro? Não deveria ser assim.

Há ali um resultado aleatório. Ao compilar, os acessos a uma célula de memória com um valor de array são desdobrados, enquanto o tamanho do array será recebido e colocado na célula de memória antes, quando o array for formado, mesmo se o array for dinâmico e as células com um tamanho de array e um valor de variável terão o mesmo tempo de acesso.

E, a julgar pela frase que os compiladores fazem no curso de 3-4 anos de informática ... em geral, espero que um nível de enquadramento suficientemente necessário não me deixe muito nervoso em um ambiente MCL)

Razão: