Ao testar, confundo o código tanto quanto possível para evitar que o optimizador deita fora os loops vazios
tem
// for(int i = 0; i < 5; i++) sum += u.param[i];
A optimização da execução do MQL pode terminar o primeiro laço antes, uma vez que os valores calculados não são utilizados, pelo que algo deve ser feito após o SpeedTest() com os resultados - este laço
verifiquei-o com o laço comentado, não o deitei fora, mas no outro teste posso cair
macro é uma questão de gosto, já o testei muitas vezes e funciona, não vejo o interesse de escrever a mesma coisa à mão
UPD: encontrei onde li como funcionam agora os compiladores modernos, bastante informativos
Все предопределенные периоды графиков имеют уникальные идентификаторы. Идентификатор PERIOD_CURRENT означает текущий период графика, на котором запущена mql5-программа.
A seguir, precisa de obter os valores na barra certa
//--- создадим хэндл индикатораif(type==Call_iRSI)
handle=iRSI(name,period,ma_period,applied_price);
//--- индикаторный буферdouble rsi_buffer[];
//--- заполняем часть массива iRSIBuffer значениями из индикаторного буфера под индексом 0if(CopyBuffer(ind_handle,0,0,amount,rsi_buffer)<0)
{
//--- если копирование не удалось, сообщим код ошибкиPrintFormat("Не удалось скопировать данные из индикатора iRSI, код ошибки %d",GetLastError());
//--- завершим с нулевым результатом - это означает, что индикатор будет считаться нерассчитаннымreturn(false);
}
Leia a ajuda, ou procure respostas no fórum - elas são muitas
a diferença não é significativa, é altamente provável que se mudarmos os testes na ordem oposta, os resultados sejam o oposto
não crítico
dificilmente é correcto incluir rand() no teste, uma vez que esta função consome muito mais recursos do que outros comandos. Penso que este seria um teste mais correcto:
#define Num 1000000#define SpeedTest(msg,s,EX) {ulong mss=GetMicrosecondCount(); EX \
mss=GetMicrosecondCount()-mss;\
printf("%-22s%llu µs; Сумма - %llu",msg,mss,s);}
//+------------------------------------------------------------------+//| Script program start function |//+------------------------------------------------------------------+voidOnStart()
{
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) && !_StopFlag;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) && !_StopFlag;i+=2)
{
u.in[0]=in[i+1];
u.in[1]=in[i];
sum+=u.param;
});
}
Resultado:
2020.10.1517:14:03.168 TestMakanu (USDCAD,M1) test binary shift : 1384 µs; Сумма - 10744345820541982020.10.1517:14:03.169 TestMakanu (USDCAD,M1) test union : 1209 µs; Сумма - 10744345820541982020.10.1517:14:19.370 TestMakanu (USDCAD,M1) test binary shift : 1891 µs; Сумма - 10739246168449492020.10.1517:14:19.371 TestMakanu (USDCAD,M1) test union : 1289 µs; Сумма - 10739246168449492020.10.1517:14:20.949 TestMakanu (USDCAD,M1) test binary shift : 1342 µs; Сумма - 10731947888316532020.10.1517:14:20.950 TestMakanu (USDCAD,M1) test union : 1178 µs; Сумма - 10731947888316532020.10.1517:14:27.141 TestMakanu (USDCAD,M1) test binary shift : 1365 µs; Сумма - 10750172905531682020.10.1517:14:27.142 TestMakanu (USDCAD,M1) test union : 1362 µs; Сумма - 10750172905531682020.10.1517:14:28.202 TestMakanu (USDCAD,M1) test binary shift : 1354 µs; Сумма - 10750518179145632020.10.1517:14:28.203 TestMakanu (USDCAD,M1) test union : 1105 µs; Сумма - 1075051817914563
Felizmente, afinal de contas, meti-me no cavalo errado. Os sindicatos são um pouco mais rápidos. São mais convenientes para trabalhar com eles e o código é mais legível.
dificilmente é correcto incluir rand() no teste, uma vez que esta função é uma ordem de magnitude mais intensiva em termos de recursos do que os outros comandos.
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
É pouco provável que seja correcto incluir rand() no teste, uma vez que esta função consome uma ordem de magnitude de mais recursos do que os outros comandos. Penso que este seria um teste mais correcto:
Resultado:
Felizmente, continuo a apostar no cavalo errado. Os sindicatos são um pouco mais rápidos. São mais convenientes para trabalhar com eles, e o código é mais legível.
Uma vez por uma vez, e à distância da primeira vitória, (como se o primeiro método tivesse removido a linha de conversão do curto para algo)
Voltei a trabalhá-lo um pouco
(é melhor não usar uma macro dessa forma ;)
Voltei a trabalhá-lo um pouco
(por isso é melhor não usar macro ;)
Ao testar, confundo o código tanto quanto possível para evitar que o optimizador deita fora os loops vazios
tem
// for(int i = 0; i < 5; i++) sum += u.param[i];A optimização da execução do MQL pode terminar o primeiro laço antes, uma vez que os valores calculados não são utilizados, pelo que algo deve ser feito após o SpeedTest() com os resultados - este laço
verifiquei-o com o laço comentado, não o deitei fora, mas no outro teste posso cair
macro é uma questão de gosto, já o testei muitas vezes e funciona, não vejo o interesse de escrever a mesma coisa à mão
UPD: encontrei onde li como funcionam agora os compiladores modernos, bastante informativos
https://habr.com/ru/post/431688/
https://habr.com/ru/post/47878/
o código dá o valor iRSI das pegas e tps sempre apenas 10, mas os preços e o gráfico também mudam.
iRSI(_Símbolo,PERÍODO_H1,14,PREÇO_CLOSE)
construir 2652
o código dá o valor iRSI das pegas e tp é sempre apenas 10, mas os preços e gráficos também mudam.
iRSI(_Símbolo,PERÍODO_H1,14,PREÇO_CLOSE)
construir 2652
Tem o cabo indicador, é 10
A seguir, precisa de obter os valores na barra certa
Leia a ajuda, ou procure respostas no fórum - elas são muitas
Tem o cabo indicador, é 10
A seguir, precisa de obter os valores na barra certa
Leia a ajuda, ou procure respostas no fórum - há muitas delas
Já está. Vou estudar os amortecedores. É estranho, tive a sensação de que tudo funciona como está, talvez o tenha confundido com mql4.
O estranho é que eu pesquisei no Google e não consegui encontrá-lo em mql5 para obter os dados do indicador.
Aha, de acordo com o seu exemplo, como eu entendi o valor do indicador RSI está no final numa variável da seguinte forma
verificado:
2020.10.15 21:48:01.401 SpeedTst (EURUSD,H1) tst 1 : : : loops=10000000000 ms=10864370
2020.10.15 21:48:12.264 SpeedTst (EURUSD,H1) tst 2 : : : loops=10000000000 ms=10862287
a diferença não é significativa, é altamente provável que se mudarmos os testes na ordem oposta, os resultados sejam o oposto
não crítico
dificilmente é correcto incluir rand() no teste, uma vez que esta função consome muito mais recursos do que outros comandos.
Penso que este seria um teste mais correcto:
Resultado:
Felizmente, afinal de contas, meti-me no cavalo errado. Os sindicatos são um pouco mais rápidos. São mais convenientes para trabalhar com eles e o código é mais legível.
dificilmente é correcto incluir rand() no teste, uma vez que esta função é uma ordem de magnitude mais intensiva em termos de recursos do que os outros comandos.
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
É pouco provável que seja correcto incluir rand() no teste, uma vez que esta função consome uma ordem de magnitude de mais recursos do que os outros comandos.
Penso que este seria um teste mais correcto:
Resultado:
Felizmente, continuo a apostar no cavalo errado. Os sindicatos são um pouco mais rápidos. São mais convenientes para trabalhar com eles, e o código é mais legível.
Uma vez por uma vez, e à distância da primeira vitória, (como se o primeiro método tivesse removido a linha de conversão do curto para algo)
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()
como uma variante para inicializar com algo como isto:
será rápidoA questão era que se devia medir exactamente o que se precisava de medir, sem qualquer coisa estranha.
O objectivo era medir exactamente o que é necessário, sem extras
não
Se houver repetição de fragmentos de código, receberá testes de optimização!
Que diferença faz quanto tempo rand() é executado?
deixar ser executado 2/3 do tempo do teste, o principal é que o tempo rand() deve ser constante
O seu código MQL irá utilizar as funções do sistema MQL, certo? - qual é o objectivo de testar um código perfeito?