Características da linguagem mql5, subtilezas e técnicas - página 117
Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se
Esta é a variante que eu inventei:
É suposto ser o mais rápido de todos os possíveis. Todos os cálculos são efectuados com constantes, por isso são calculados durante a compilação. Assim, tudo é reduzido a apenas 6 comparações consecutivas e nada mais. Contudo, esta variante funciona mais lentamente do que a anterior. Não consigo compreender a razão para isso.
Esta é a variante que eu inventei:
Na ideia, este é o mais rápido de todos os possíveis. Todos os cálculos são feitos com constantes, pelo que são calculados durante a compilação. Assim, tudo é reduzido a apenas 6 comparações consecutivas, e nada mais. Contudo, esta variante funciona mais lentamente do que a anterior. Não consigo compreender qual é a razão.
Dividir por dois desacelera o processo ? Tentar substituir por um turno? suspeito que as constantes calculadas - devem ser calculadas imediatamente (neste caso - e o turno na definição - também deve ser substituído por uma constante).
Além disso, "pergunta" é um operador bastante controverso, como eu sei. Há vinte anos foi verificado em C++ e por vezes "pergunta" gera um código muito mais longo do que o habitual se operador. Talvez seja o mesmo aqui?
E, eu faria com que o código de retorno não fosse utilizado - e se houver algumas verificações na conversão de valores assinados e não assinados?
Ainda não tenho oportunidade de experimentar manualmente - a CPU está muito sobrecarregada... Até o texto é dactilografado "com lentidão"...
Dividir por dois desacelera o processo ? Tentar substituí-lo por um turno ? suspeito que as constantes calculadas - devem ser calculadas imediatamente (neste caso - e o turno na definição - também deve ser substituído por uma constante).
Também - "pergunta" - como sei, é um operador bastante controverso ...
A substituição da divisão por turno não tem qualquer efeito. Suspeito que a expressão resultante seja demasiado longa, pelo que o compilador não a optimizou até ao fim.
Mas fiz os testes quando Optimize=0, enquanto que quando a optimização foi activada, tudo correu bem - a segunda variante foi uma vez e meia mais rápida. Bingo!
Se a optimização for desactivada, então a segunda opção é ligeiramente mais lenta a valores pequenos, mas ligeiramente mais rápida a valores maiores. Em suma, a segunda opção é definitivamente melhor.
Esta é a variante que eu inventei:
Esta é supostamente a mais rápida de todas as variantes possíveis. Todos os cálculos são efectuados com constantes, pelo que são calculados durante a compilação. Assim, tudo é reduzido a apenas 6 comparações consecutivas e nada mais. No entanto, esta variante funciona mais lentamente do que a anterior. Não consigo compreender a razão para isso.
É isso mesmo - a sua variante é a mais rápida.
É que o teste é ocioso. Os programadores esquecem-se muitas vezes de uma coisa importante quando testam o desempenho: se um valor calculado não for utilizado em qualquer lugar, o compilador simplesmente não efectua o cálculo.
Faz sentido, qual é o objectivo? É como em sobreposição quântica. Porque deveria a lua existir se ninguém está a olhar para ela. "A lua existe só porque um rato está a olhar para ela?" (Albert Einstein). :))
Assim, esta versão do teste com o cálculo da soma de controlo e a sua impressão seria mais correcta:
Resultado:
E o segundo lugar continua a ser _FastLog2, não log2 :))É apenas um teste ocioso. Um ponto importante é muitas vezes esquecido nos testes de desempenho: se o valor calculado não for utilizado em qualquer lugar, o compilador simplesmente não efectua o cálculo.
Faz sentido, qual é o objectivo? É como em sobreposição quântica. Porque deveria a lua existir se ninguém está a olhar para ela. "A lua existe só porque um rato está a olhar para ela?" (Albert Einstein). :))
Assim, esta versão do teste com o cálculo da soma de controlo e a impressão será mais correcta:
O seu código está emaranhado. As variáveis utilizadas na definição estão localizadas no outro extremo do código do programa - não é conveniente ordenar através de tal caos. Mas não é essa a questão. A questão é que os resultados dos seus testes não podem ser considerados fiáveis porque o compilador conhece antecipadamente o algoritmo de valores passados para a função. Por isso, optimiza os seus testes. Deve calcular em números aleatórios .
A propósito, porque é que tem uma ordem no seu código? Quando o vi, no início pensei que estava a usar aleatoriamente, mas na verdade não está.
Aqui está o meu código:
O seu código é confuso. As variáveis utilizadas na definição estão localizadas no outro extremo do código do programa - é inconveniente ordenar através de tal caos. Mas não é esta a questão, a questão é que os resultados dos seus testes não podem ser considerados fiáveis, porque o compilador conhece antecipadamente o algoritmo de valores passados para a função. Por isso, deve optimizar os seus testes. Deve calcular sobre números aleatórios .
A propósito, porque é que tem uma ordem no seu código? Quando o vi, no início pensei que estava a usar aleatoriamente, mas na verdade não está.
Aqui está o meu código:
o código não é meu. Apenas o afinei e removi o rand para verificar os mesmos checksums e remover a função rand relativamente cara do laço, mas esqueci-me simplesmente de remover o srand.
Eu devolvo rand. Tem razão - o compilador optimiza o laço para a soma dos logaritmos a partir de valores consecutivos. Estou surpreendido, no entanto. Não compreendo como é que isso acontece. Talvez haja algo que não estamos a ter em conta.
Resultado:
O vencedor actual é _FastLog2
Resultado:
Vencedor actual _FastLog2
Pergunto-me como terá obtido o mesmo checksum em todo o lado, se os valores são aleatórios.
Pergunto-me como se obtém o mesmo checksum em todo o lado, se os valores são aleatórios.
srand(45) para todas as funções
No início também o fiz dessa forma, mas consegui diferentes checksums, porque não tive em conta que rand()*rand() pode ser 0, o que quebra o checksum. Agora acrescentei um para me afastar do zero.
srand(45) para todas as funções
Fiz o mesmo no início, mas consegui diferentes checksums, porque não tive em conta que rand()*rand() pode ser 0, o que quebra o checksum. Agora acrescentei um para me afastar do zero.
E porque é que precisa do mesmo checksum se estamos a falar especificamente de medições de velocidade? O objectivo da soma neste caso é simplesmente evitar que o compilador corte o código, só isso. E ao fazer srand(45), permite novamente optimizar o teste.
A propósito, falando de zero, FastLog2 não verifica o zero, o que lhe dá um avanço. Mas ainda é uma vez e meia a duas vezes mais lento do que o log2 se testado correctamente).
E porque precisa do mesmo checksum se estamos a falar especificamente de medições de velocidade? O objectivo da soma neste caso é simplesmente evitar que o compilador corte o código, só isso. E fazer srand(45), mais uma vez, permite-lhe optimizar o teste.
Está aqui a sobrestimar as capacidades do compilador. Remover srand(45) - os checksums serão diferentes, mas o resultado da velocidade permanece o mesmo.
Além disso, fui guiado pelo facto de os cálculos serem os mesmos por causa da pureza da experiência, porque não entrei em detalhes de todas as funções. Por vezes, o valor de um parâmetro de função pode afectar o tempo da sua execução.
Mais uma razão para verificar a correcção dos algoritmos.