Discussão do artigo "Distribuições estatísticas no MQL5 - tirando o melhor de R" - página 7
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
Estou falando de R, mas minha habilidade é muito pequena)) Alguém pode verificar se o código está correto?
Se o código estiver correto, você pode verificar o benchmark?
O código está errado.
Você mediu o tempo de compilação da função, não de sua execução:
A função cmpfun compila o corpo de uma closure e retorna uma nova closure com os mesmos formais e o corpo substituído pela expressão do corpo compilado.
Prova do erro:
> library(microbenchmark) > library(compiler) > n <- 2000 > k <- seq(0,n,by=20) > qqq<- function(xx) { a <- dbinom(k, n, pi/10, log = TRUE) } > res <- microbenchmark(cmpfun(qqq)) > a Ошибка: объект 'a' не найденSe a função qqq tivesse sido executada durante o benchmark, o objeto a teria recebido os dados computados. Mas, em vez disso, descobriu-se que o objeto nem sequer foi criado.
Como resultado, o parâmetro de comparação contou o tempo de compilação em vez do tempo de execução. Em meu código, tudo está correto: o benchmark conta o tempo de execução real e o objeto a é criado com os dados corretos.
E sim, a compilação é um processo bastante dispendioso: ela é mostrada em milissegundos em vez de microssegundos
E uma piada à parte, como você substituiu a função do sistema q() - sair - em seu exemplo.
Não havia como sair do R :)
Quero dizer que o compilador mql já conhece todos os parâmetros de entrada no momento da compilação. É suficiente que ele calcule tudo durante a compilação e, ao chamar o script, ele apenas retorna o resultado pré-calculado. Vi alguns artigos no hub em que eles comparavam compiladores c++ e, a julgar pela análise do código assembler, é exatamente isso que acontece lá.
Sim, ele pode estar usando-o ativamente. Aqui estão alguns exemplos: https://www.mql5.com/ru/forum/58241.
Mas, nesse caso, isso não funcionará - você precisa contar por completo devido à complexidade, ao loop e ao preenchimento de array.
Se o código estiver correto, você pode verificar o benchmark?
Você precisa substituirres <- microbenchmark(cmpfun ( q)) por res <- microbenchmark(q())). Mas as bibliotecas compiladas anteriormente não serão recompiladas em bytecode, obtive os mesmos resultados.
qqq<- function(xx) { a <- dbinom(k, n, pi/10, log = TRUE) }"a", nesse caso, será uma variável local, inacessível fora da própria função. Mas você pode fazer isso desta forma -
a <<- dbinom(k, n, pi/10, log = TRUE)
então ela será uma variável global.
Mas, nesse caso, isso não funcionará - você precisa contar por completo devido à complexidade, ao loop e ao preenchimento da matriz.
Entendo, então a velocidade de execução é excelente
A propósito, não custa praticamente nada interpretar a chamada primitiva a <- dbinom(k, n, pi/10, log = TRUE) com uma queda direta no kernel do R com execução nativa(dbinom está em r.dll).
Portanto, tentar compilar essa chamada é obviamente inútil.
Como já escrevi muitas vezes sobre a rapidez do R, deixe-me colocar meus cinco centavos.
Caro Renat!
Seu exemplo não tem nada de mais!
Você pegou duas funções semelhantes e tirou uma conclusão sobre o desempenho do R.
As funções que você forneceu não representam o poder e a diversidade do R.
Você deve comparar operações com capacidade computacional.
Por exemplo, multiplicação de matriz...
Vamos medir a expressão no R
c <- a*b,
em que a e b são matrizes de tamanho mínimo de 100*100. Em seu código, certifique-se de que o R use o MKL da Intel. E isso é feito simplesmente instalando a versão correspondente do R.
Se olharmos para o R, veremos que há montanhas de código contendo operações computacionalmente intensivas. Para executá-las, são usadas bibliotecas, que são as mais eficientes no momento.
E a utilidade do R na negociação não está nas funções que você reescreveu (embora elas também sejam necessárias), mas nos modelos. Em uma de minhas respostas a você, mencionei o pacote caret. Veja o que ele é.... A implementação de qualquer modelo de negociação praticamente útil dentro da estrutura desse pacote e no µl lhe dará a resposta
Além disso, não se esqueça de que carregar todos os núcleos de um computador é uma rotina do R. Além disso, você pode carregar comps vizinhas na rede local.
PS.
Para mim, a ideia de comparar o desempenho do MKL e do R é questionável: esses dois sistemas têm áreas temáticas completamente diferentes
SanSanych, testaremos tudo e lançaremos um benchmark. Mas primeiro vamos concluir a funcionalidade.
O teste foi justificado e revelou imediatamente o problema. Apresentei a justificativa teórica e tenho certeza de que a sobrecarga do sistema do R será preservada para a enorme quantidade de funcionalidades.
Podemos multiplicar as matrizes de tal forma que a Intel perderá. Não se trata de ciência de foguetes há muito tempo, e a Intel (ou melhor, esses programadores terceirizados dentro da afiliação da empresa) não é campeã em conhecimento mítico de seus processadores.
Como já escrevi muitas vezes sobre a rapidez do R, deixe-me colocar meus cinco centavos.
.................
Para San-Sanych e os outros colegas.
San-Sanych, você sabe o quanto eu o respeito... ((S) Kataev e Feinzilberg, conhecidos como "Ilf e Petrov"), apesar de algumas de suas piadas pós-soviéticas aqui.
Deixe-me esclarecer algo importante para você:
1). O principal trabalho de um programador não é escrever programas, mas LER programas, especialmente os seus próprios. Qualquer programador 95... 99% do seu tempo fica sentado olhando para o monitor. Ele escreve um programa? Não, na maioria das vezes ele o lê. Portanto, quanto mais próximo da linguagem natural for o que ele lê na tela, ou seja, do que lhe foi ensinado pela mãe, pelo pai, pela avó, pelo professor da escola, mais eficientemente ele decifrará essas krakozebras linguisticamente obedientes na tela e encontrará a correspondência entre o algoritmo e seu programa.
2). Para os fins do ponto (1), não há nada melhor, em média, do que a linguagem C. É por isso que, por exemplo, eu pessoalmente (bem como 2-3 pessoas responsáveis e não muito responsáveis) consegui escrever um projeto com mais de 700 sub-rotinas em C, MQL4, CUDA..... E tudo funciona.
3). Do ponto de vista do ponto (1), a variante orientada a objetos do C, ou seja, o C++, é muito pior. (Mas falaremos disso em outra ocasião).
4). A compatibilidade total do C clássico com a MQL4 é simplesmente inestimável. A transferência de um procedimento para frente e para trás leva meio minuto.
5). A principal vantagem do C+MQL4 é a CLAREZA. Ou seja, a compreensibilidade e a transparência de tudo o que está na tela do programador.
Se compararmos o C-MQL4 com o seu R, não devemos olhar para a velocidade e o volume do código escrito, mas para a CLAREZA do texto. Ou seja, sua compreensibilidade. Caso contrário, o programador ficará olhando para a tela por 24 horas em tentativas vãs de entender o que o programa faz, quais parâmetros ele tem, por que o autor os nomeou assim e, em geral, por que o programador fez isso dessa maneira e não de outra. Não é a velocidade do programa que é importante aqui, mas a correção de seu trabalho e a velocidade de sua APLICABILIDADE para o programador final.
Desse ponto de vista, o que o Metaquotes fez foi, obviamente, um grande apoio para aqueles que querem inserir estatísticas em seus EAs. Não há nada que se compare em termos de simplicidade e compreensibilidade das funções. E isso é importante. Especialmente se você tiver cálculos delicados (e o Forex e as negociações em geral exigem cálculos delicados).
Vamos comparar.
Aqui está a aparência da função de integração em C - MQL4:
Vou escrever em partes, pois é mais fácil escrever dessa forma.
Há uma função de integração trapezoidal em seu interior:
Tudo é absolutamente claro e compreensível. E o mais importante é que ele sempre funciona e funciona bem, ou seja, com poucos erros, mesmo no MT4-MQL4, o que economiza muito tempo.
Mas se você quiser descobrir por que tem erros incompreensíveis ao trabalhar no R, ou se quiser apenas entender quais parâmetros existem no procedimento de integração ou qual método de integração foi programado, você verá o seguinte (Deus me perdoe por postar isso para crianças imaturas em programação):
http://www.netlib.org/quadpack/
Esse é apenas o título da função originalmente escrita em Fortran. O texto principal virá mais tarde. Esse é o programa original usado no pacote R para integração.
O que há para entender aqui, me diga?