pergunta para #define experts - página 11

 
Igor Makanu:

se fisicamente no comando CPU, não

uma matriz é uma área de memória, o acesso aos elementos da matriz é calcular um índice de um elemento desde o início desta área de memória e recuperar dados (bytes) de acordo com o tipo armazenado


se esta é a lógica do algoritmo, então sim, elas são variáveis indexáveis.

em geral, sobre o problema em estudo, o único conselho correto é https://www.mql5.com/ru/forum/354662/page4#comment_19039624:

     {
      for(int i=0; i<ArraySize(mas); i++)
        {  
        r2+=ArraySize(mas);
        r2|=ArraySize(mas); 
        }

     }  
   ulong t2=GetMicrosecondCount();
   //for(ulong z=0; z<max; z++)
   int sizem=ArraySize(mas);
     {
      for(int i=0; i<sizem; i++)
        { 
        r2+=sizem;
        if (r2>10) r2|=sizem; 
        }
     } 

O tempo de execução de uma operação binária é muitas vezes mais rápido do que o tempo de execução de uma declaração if (deveria ser) .... Parece que nos bastidores, código nativo limpo ou super rápido

O tempo do topo é metade do tempo do fundo.


Bem, tecnicamente estávamos comparando duas variáveis))

 
Alexandr Andreev:

O tempo de execução de uma operação binária é muitas vezes mais rápido do que o tempo de execução de uma declaração se (deve ser assim) ....

não deve haver se() em loops , mais cedo o loop foi executado pelo registro CX

Alexandr Andreev:

O tempo do superior é metade do tempo do inferior

Não estou discutindo, eu estava testando novamente pela manhã, a otimização do tempo sempre funciona em MQL5, o resultado depende do número de loops, bem qual teste foi chamado primeiro - não vou testar novamente, é uma perda de tempo

 
Igor Makanu:

não deve haver se() em loops , anteriormente o loop era executado pelo caso CX

Não estou discutindo, eu estava testando novamente pela manhã, a otimização do tempo sempre funciona em MQL5, o resultado depende do número de loops, bem, qual teste foi chamado primeiro, eu não vou testar novamente, é uma perda de tempo

.... Você precisa observar seus postos)))) o posto acima se refere ao posto que sugeriu que o operador do ArraySize verifique a existência de excessos (ESTE é o seu "se") e é adicionando-o ao corpo que você realmente verifica, e esta é a única maneira correta.

E a diferença de executar o primeiro está apenas em seus testes)

 
Alexandr Andreev:

E a única diferença de executar o primeiro está em seus testes)

Dê-me seu teste, vamos ver.

embora... Eu não preciso dele, estou participando da discussão por padrão, você pode usá-lo, não tenho tanta certeza sobre a utilidade do ArraySize() na condição de terminação do loop

 

.ex5 dimensões

void OnStart() // размер 12 272 байт
{
   int arr[];
   ArrayResize(arr, 100);
   ArrayInitialize(arr, 1);
   int sum = 0;
   for(int i = ArraySize(arr) - 1; i >= 0; i--)
   {
      sum += arr[i];
   }
   printf("sum = %i", sum);//sum = 100
}
//+------------------------------------------------------------------+
void OnStart() // размер 11 860 байт
{
   int arr[];
   ArrayResize(arr, 100);
   ArrayInitialize(arr, 1);
   int sum = 0;
   for(int i = 0; i < ArraySize(arr) - 1; i++)
   {
      sum += arr[i];
   }
   printf("sum = %i", sum);//sum = 100
}
//+------------------------------------------------------------------+
void OnStart() // размер  12 174 байт
{
   int arr[];
   ArrayResize(arr, 100);
   ArrayInitialize(arr, 1);
   int sum = 0;
   for(int i = 0, sz = ArraySize(arr); i < sz; i++)
   {
      sum += arr[i];
   }
   printf("sum = %i", sum);//sum = 100
}
 
Quem sabe, além dos fabricantes de compiladores? Talvez o ArraySize() funcione exatamente como uma referência variável. Parece possível.
 
Dmitry Fedoseev:
E quem conhece senão os criadores do compilador? Talvez o ArraySize() funcione da mesma forma que lidar com uma variável. Parece possível.
void OnStart()
  {
   int mas[];  
   int size=1000000000;
   ArrayResize(mas,size); 
   int r2=0; 
   int tr=0;  
    int num_steps=ArraySize(mas); 
    double step = 1.0/(double)num_steps;
    
     int v=size;
    ulong t1 = GetMicrosecondCount();
    
  // for(ulong z=0; z<max; z++)
  
   int sizem=Size(mas);
     {
      for(int i=0; i<sizem; i++)
        { 
        r2+=sizem;
        r2|=sizem; 
        }
     } 
   ulong t2=GetMicrosecondCount(); 
     {
      for(int i=0; i<Size(mas); i++)
        {  
        r2+=Size(mas);
        r2|=Size(mas); 
        } 
     }  
   ulong t3=GetMicrosecondCount();
   
  Print(t2-t1," ",t3-t2," ",r2) ; 
  }
 
int Size(int &mas[]){return Size2(mas);} 
int Size2(int &mas[]){return Size3(mas);} 
int Size3(int &mas[]){return ArraySize(mas);} 

Observe que aqui o teste entre a função que chama a função que chama o ArraySize e a velocidade é o mesmo, o que acessar apenas uma variável. Porque o compilador apenas os desdobra

ArraySize

de usar o ArraySize() na condição de terminação do loop


e não há diferença de rearranjo
Документация по MQL5: Основы языка / Функции / Вызов функции
Документация по MQL5: Основы языка / Функции / Вызов функции
  • www.mql5.com
Если некоторое имя, которое не было описано ранее, появляется в выражении и за ним следует левая круглая скобка, то оно по контексту считается именем некоторой функции. Аргументы (формальные параметры) передаются по значению, т. е. каждое выражение x1, . . . , xn вычисляется и значение передается функции. Порядок вычисления выражений и порядок...
 

outro teste da_bald....

Por que você testa sua criação uma vez?

testá-lo pelo menos dez vezes para ver o que acontece

embrulhado em código de laço externo, resultado:

HQ 0 15:26:55.230 tst (EURUSD,H1) 558620 543908 -512

RO 0 15:28:08.672 tst (EURUSD,H1) 544176 543129 -512

EF 0 15:28:09.759 tst (EURUSD,H1) 544139 543144 -512

RM 0 15:28:10.847 tst (EURUSD,H1) 544174 543436 -512

GD 0 15:28:11.934 tst (EURUSD,H1) 543668 543531 -512

CR 0 15:28:13.021 tst (EURUSD,H1) 543413 543097 -512

JI 0 15:28:14.107 tst (EURUSD,H1) 543046 543218 -512

HP 0 15:28:15.194 tst (EURUSD,H1) 543337 543469 -512

PO 0 15:28:16.282 tst (EURUSD,H1) 543602 544455 -512

KE 0 15:28:17.369 tst (EURUSD,H1) 543253 543197 -512

CL 0 15:28:18.457 tst (EURUSD,H1) 544199 543664 -512

Não vou reorganizar os loops testados, me aborreci com o tamanho do código acima, isso significa boa otimização, talvez com o analisador de código, no ano passado me surpreendi, na otimização iCustom para MQL4 - 4 chamadas de 4=x buffers indicadores são substituídas por uma chamada, houve um tópico em algum lugar, novamente sobre eficiência

em geral, a Metacquotes fez um bom trabalho na análise dos códigos de tipo dos usuários, ou seja, o compilador consertará a maioria das coisas dos usuários por si só... legal, imho!

 

Desculpe, eu posso estar errado. Eu não li tudo isso. Apenas a primeira página. A impressão é a de sempre. Alguém faz uma pergunta específica. E então os alagadores entram em cena.

Desculpe novamente, este é realmente um fórum de desenvolvedores ?????

 
Сергей Таболин:

Desculpe, eu posso estar errado. Eu não li tudo isso. Apenas a primeira página. A impressão é a de sempre. Alguém faz uma pergunta específica. E então os alagadores entram em cena.

Desculpe novamente, este é realmente um fórum de desenvolvedores ?????

Errado, outras questões foram levantadas ali também, diferentes das da TC. E a compreensão dos princípios de compilação às vezes ajuda.

Razão: