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);}
//+------------------------------------------------------------------+voidOnStart()
{
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?
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 |//+------------------------------------------------------------------+//+------------------------------------------------------------------+voidOnStart()
{
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];
}
)
}
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.
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
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++
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?
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.
BOMB
Aqui está o seu código que prova o contrário.
Acabei de trocar os cheques.
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
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
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
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
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.
É 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:
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