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)))))
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......
)))) 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
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.
voidOnStart()
{
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.0221:33:22.863 TestScript (USDJPY,M1) Total time: 451.200 ms
voidOnStart()
{
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.0221:56:26.591 TestScript (USDJPY,M1) Total time: 531.872 ms
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
Внешние функции, определенные в другом модуле, должны быть явно описаны. Описание включает в себя тип возвращаемого значения, имя функции и набор входных параметров с их типами. Отсутствие такого описания может привести к ошибкам при компиляции, компоновке или выполнении программы. При описании внешнего объекта используйте ключевое слово С...
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)
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á
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)))))
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.
)))) 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
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.
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ê?
cntmudá-lo para você, como acontece na primeira variante
500p pergunta (sem verificação), qual o caminho mais rápido. ver quantas funções externas são chamadas no método superior
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
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á...
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)