Obter o número de casas decimais de quaisquer números (não apenas citações) contornando Dígitos() em MQL4 e MQL5 - página 21

 
Nikolai Semko:
Na estrada, por enquanto. Você mesmo pode tentar. A idéia é utilizar uniões com matrizes de estruturas de diferentes tamanhos, por exemplo 10, 100, 1000, 10000...
Isto encurtará o ciclo por ordens de magnitude e reduzirá o número de chamadas do ArrayCopy por ordens de magnitude.
Isto deve ser próximo à variante de memópias.

Esta idéia foi utilizada. Neste caso, a

Você pode ver tudo no código fonte.
 
fxsaber:

Esta idéia foi utilizada. Ao fazer isso

Você pode ver tudo no livro fonte.
Sim, pesquisamos. Estranho que não tenha qualquer efeito.
 
Nikolai Semko:
Sim, pesquisamos. Estranho que não tenha efeito.

Há uma linha na fonte que controla o tamanho

#define  CONVERT_AMOUNT 128

Você pode alterar este valor e ver o resultado. Se o valor for superior a cem, a velocidade não aumenta. Na verdade é fácil de explicar, porque todos os mesmos elementos são copiados no total. E as lentidões associadas a pequenas porções de cópias são eliminadas.

 
fxsaber:

Receio que já estejamos presos ao máximo desempenho.

Sim, eu concordo.
Eu tentei - o mesmo resultado que em seu TicksToIntArray_fxsaber4/IntArrayToTicks_fxsaber4

 
Andrey Khatimlianskii:

Você tem o código fonte, você mesmo pode medi-lo.

Então, meça-o. Tenho quase certeza de que não, portanto não vejo a utilidade de perder tempo com o artigo ou com a medição.

 
fxsaber:

Receio que já estejamos no limite do desempenho.

Para ser honesto, estou muito surpreso que eles tenham conseguido chegar tão perto da memcpia. Simplesmente não pode ser. Algo está errado.

 
fxsaber:

Receio que já estejamos presos com o máximo desempenho.

Acho que entendo um erro de cálculo muito sério.
Seu BANCH seleciona o mínimo de 50 execuções absolutamente idênticas.
Mas o compilador é um grande espertalhão e preguiçoso. Ele não fará o mesmo trabalho 50 vezes e otimizará o código. É por isso que você deve pelo menos mudar as matrizes em cada corrida. Ou você pode substituir 50 por 1 e aumentar o número de testes. Então os resultados serão bem diferentes e mais objetivos.

2018.12.09 13:55:43.048 StructToArray__2        https://www.mql5.com/ru/forum/287618/page18#comment_9813963
2018.12.09 13:55:43.048 StructToArray__2        TicksToIntArray_thexpert
2018.12.09 13:55:43.296 StructToArray__2        Time[TicksToIntArray(TicksIn,Array)] = 247579
2018.12.09 13:55:43.296 StructToArray__2        IntArrayToTicks_thexpert
2018.12.09 13:55:43.544 StructToArray__2        Time[IntArrayToTicks(Array,TicksOut)] = 247840
2018.12.09 13:55:43.634 StructToArray__2        true
2018.12.09 13:55:43.766 StructToArray__2        
2018.12.09 13:55:43.766 StructToArray__2        https://www.mql5.com/ru/forum/287618/page18#comment_9814108
2018.12.09 13:55:43.766 StructToArray__2        TicksToIntArray_fxsaber4
2018.12.09 13:55:44.118 StructToArray__2        Time[TicksToIntArray(TicksIn,Array)] = 351847
2018.12.09 13:55:44.118 StructToArray__2        IntArrayToTicks_fxsaber4
2018.12.09 13:55:44.452 StructToArray__2        Time[IntArrayToTicks(Array,TicksOut)] = 334011
2018.12.09 13:55:44.548 StructToArray__2        true
2018.12.09 13:55:44.692 StructToArray__2        
2018.12.09 13:55:44.692 StructToArray__2        https://www.mql5.com/ru/forum/287618/page18#comment_9814108
2018.12.09 13:55:44.692 StructToArray__2        TicksToIntArray_semko
2018.12.09 13:55:45.037 StructToArray__2        Time[TicksToIntArray(TicksIn,Array)] = 344707
2018.12.09 13:55:45.037 StructToArray__2        IntArrayToTicks_semko
2018.12.09 13:55:45.373 StructToArray__2        Time[IntArrayToTicks(Array,TicksOut)] = 336193
2018.12.09 13:55:45.462 StructToArray__2        true

Quando a diferença em relação ao memcpy é de 40%, é mais plausível

Será que a compressão da matriz terá um efeito? Um conjunto de carrapatos pode ser comprimido por um fator de 10-12. A única questão é se isso economizará o tempo resultante no envio e recebimento através do recurso.

Arquivos anexados:
 
Nikolai Semko:

Acho que entendo um erro de cálculo muito sério.
Seu BANCH seleciona o mínimo de 50 execuções absolutamente idênticas.
Mas o compilador é um grande espertalhão e preguiçoso. Ele não fará o mesmo trabalho 50 vezes, ele otimizará o código.

O código é escrito de tal forma que fará exatamente o que é suposto fazer. O compilador não será capaz de afetar a velocidade da memória, mas os resultados dos passes são os seguintes

Um loop de um passe

https://www.mql5.com/ru/forum/287618/page18#comment_9813963
TicksToIntArray_thexpert
Time[TicksToIntArray(TicksIn,Array)] = 235285
IntArrayToTicks_thexpert
Time[IntArrayToTicks(Array,TicksOut)] = 192509
true


De 50

https://www.mql5.com/ru/forum/287618/page18#comment_9813963
TicksToIntArray_thexpert
Time[TicksToIntArray(TicksIn,Array)] = 80970
IntArrayToTicks_thexpert
Time[IntArrayToTicks(Array,TicksOut)] = 81103
true
 
fxsaber:

O código é escrito de tal forma que fará exatamente o que você quer que ele faça. O compilador é incapaz de afetar a velocidade da memcpia, mas os resultados dos passes são

Um laço de um passe


De um total de 50.

Mas então por que isso acontece? É claro que o compilador não pode afetar o processo de execução da memória, mas pode recusar-se a executá-la, puxando os resultados pré-armazenados do primeiro cálculo, se entender que nenhum dos parâmetros calculados muda durante o loop. É assim que eu mesmo organizaria o compilador para corrigir os alogismos do programa.
 
Ilya Malev:

Então, meça-o. Tenho quase certeza de que não, portanto não vejo a utilidade de perder tempo com o artigo ou com a medição.

Não é necessário.