A propósito, cerca de zero, FastLog2 não verifica o zero, o que lhe dá um avanço. Mas ainda é 1,5-2 vezes mais lento que o log2 se testado correctamente).
E o que há de errado nisso?
Porque até a sua versão do teste produz:
2019.01.0504:43:12.372 TestLog (EURUSD,H1) Result log2: sum=1400005128 time=297 ms
2019.01.0504:43:12.635 TestLog (EURUSD,H1) Result log2_: sum=1400018381 time=262 ms
2019.01.0504:43:12.809 TestLog (EURUSD,H1) Result _FastLog2: sum=1400004095 time=174 ms
A propósito, cerca de zero, FastLog2 não verifica o zero, o que lhe dá um avanço. Mas ainda é 1,5-2 vezes mais lento que o log2, se testado correctamente).
Claro, devemos remover a verificação zero do log2 ou adicionar a mesma ao FastLog2.
A questão é realmente sobre a velocidade da parte computacional. Em log2, tudo é calculado puramente por turnos e adições. FastLog2 utiliza valores de tabela após conversões inteligentes envolvendo multiplicação. Este código é muito antigo, era utilizado nos tempos dos coprocessadores de matemática, a situação pode muito bem ter mudado desde então.
Verificou-o em C++. Sim, FastLog2 é de facto o mais rápido. Código inteligente, no entanto ) Talvez a razão seja que as operações bitwise são muito mais rápidas do que as operações de comparação.
Testei todos os códigos no MT4. No MT4 o compilador não realiza qualquer optimização (ou seja, a variante com soma mostra os mesmos resultados relativos da minha variante original sem soma), e no MT4 o log2 corre mais rápido do que FastLog2. E no MT5 a optimização já é executada sem soma (ou seja, o código aparentemente não é executado completamente), e a variante FastLog2 é mais rápida do que o log2. Que conclusões se podem tirar disto não sei, porque não há pormenores sobre como o optimizador de códigos funciona ali e ali.
Este é o comportamento padrão da MQL5: as variáveis estáticas começam depois das variáveis globais.
É por isso que cada variável estática de uma classe/estrutura tem de ser declarada após a própria estrutura? E mesmo sem lhe atribuir qualquer valor... Talvez devêssemos sugerir que o compilador faça tudo isto automaticamente?
Isto é essencialmente um bug, uma sequência incorrecta de execução do código do programa. O compilador não deve permitir isto em princípio. Deve-se gritar mais vezes com os programadores sobre isto.
Em C++ o código é processado pelo compilador estritamente de cima para baixo, pelo que tudo o que vem de cima já está inicializado. E não se pode aceder ao código de baixo. É por isso que tudo é claro. E desde que os criadores introduziram aqui as suas próprias regras, deixem-nos fornecer a ordem correcta de execução do código.
Em C++, o código é processado pelo compilador estritamente de cima para baixo, por isso qualquer coisa em cima já está inicializada. E não se pode aceder ao de baixo. É por isso que tudo é claro.
A propósito, cerca de zero, FastLog2 não verifica o zero, o que lhe dá um avanço. Mas ainda é 1,5-2 vezes mais lento que o log2 se testado correctamente).
E o que há de errado nisso?
Porque até a sua versão do teste produz:
A propósito, cerca de zero, FastLog2 não verifica o zero, o que lhe dá um avanço. Mas ainda é 1,5-2 vezes mais lento que o log2, se testado correctamente).
Claro, devemos remover a verificação zero do log2 ou adicionar a mesma ao FastLog2.
A questão é realmente sobre a velocidade da parte computacional. Em log2, tudo é calculado puramente por turnos e adições. FastLog2 utiliza valores de tabela após conversões inteligentes envolvendo multiplicação. Este código é muito antigo, era utilizado nos tempos dos coprocessadores de matemática, a situação pode muito bem ter mudado desde então.
Este é o comportamento padrão da MQL5: as variáveis estáticas vêm depois das variáveis globais.
Pode ficar muito confuso por causa disto.Este é o comportamento padrão da MQL5: as variáveis estáticas começam depois das variáveis globais.
É por isso que cada variável estática de uma classe/estrutura tem de ser declarada após a própria estrutura? E mesmo sem lhe atribuir qualquer valor... Talvez devêssemos sugerir que o compilador faça tudo isto automaticamente?
Isto é essencialmente um bug, uma sequência incorrecta de execução do código do programa. O compilador não deve permitir isto em princípio. Deve-se gritar mais vezes com os programadores sobre isto.
Em C++ o código é processado pelo compilador estritamente de cima para baixo, pelo que tudo o que vem de cima já está inicializado. E não se pode aceder ao código de baixo. É por isso que tudo é claro. E desde que os criadores introduziram aqui as suas próprias regras, deixem-nos fornecer a ordem correcta de execução do código.
Em C++, o código é processado pelo compilador estritamente de cima para baixo, por isso qualquer coisa em cima já está inicializada. E não se pode aceder ao de baixo. É por isso que tudo é claro.
Há menos flexibilidade.