Discussão do artigo "Distribuições estatísticas no MQL5 - tirando o melhor de R" - página 13
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
Leia.
Entrei no assunto.
Acho que os testes dados por você não estão totalmente corretos. Considero necessário escrever sobre isso, porque as comparações de desempenho não são a última coisa.
A questão é que o MKL é qualitativamente diferente do R. E em casos de comparações de desempenho, essas diferenças qualitativas devem ser levadas em conta sempre que possível. O R é um interpretador e o MKL é um compilador. Essa diferença qualitativa para programas industriais é vantajosa para o MKL.
Dê uma olhada no código-fonte do R (é um código-fonte aberto). Lá, toda a matemática básica em C/C++ é compilada no mecanismo. E a maioria dos pacotes também é escrita em C++, caso contrário, você não poderá esperar pelos resultados dos cálculos.
Se o R fosse um interpretador de funções básicas/sistema, ele ficaria 200 a 500 vezes atrás do MQL5. Testamos especificamente as funções de sistema C/C++ do R, em vez de criar processamento manual em loops (onde o R fica centenas de vezes atrás).
No desenvolvimento do R, há uma busca constante por "como posso encontrar um pacote para não ter que escrever um loop for/while/foreach". De fato, há apenas um método de fazer cálculos no R, que é passar todos os cálculos mais ou menos massivos para pacotes de terceiros.
Mas há outra diferença qualitativa, que também é de grande importância na operação industrial de programas, e nos testes essas diferenças não foram levadas em conta, o que levou a resultados distorcidos.
A diferença qualitativa entre o R e o MKL é que o objeto elementar no MKL é um escalar, a partir do qual são criados objetos mais complexos, por exemplo, vetores. São os vetores que alimentam a entrada das funções de distribuição.
Procure no catálogo /include/math/stat centenas de funções vetoriais.
No R, não há nenhum conceito de escalar. O objeto mais simples é um vetor. O R explora amplamente esse fato e, em nosso exemplo de comparação de funções de distribuição no código R, podemos ver claramente uma técnica de programação específica do R, como a "vetorização", que não está disponível no MKL. Como essa é uma técnica específica do R que acelera os cálculos de 10 a 100 vezes (dependendo do tamanho da matriz), o código do R teria que conter essa mesma técnica. O uso da vetorização é óbvio, porque nos testes pegamos um vetor de entrada e realizamos cálculos sobre ele 100 vezes, ou seja, é uma matriz com a mesma, mas podemos fazer o que com colunas diferentes.
Não há vetorização nem recursos modernos no R. O código lá é simplesmente escrito de cabeça para baixo por jovens programadores comuns. Sim, eles são matemáticos decentes, mas são programadores medíocres.
As GPUs em R continuam sendo apenas contos de fadas e tentativas isoladas nos pacotes mais raros.
Em resumo: um texto em R deve ser escrito em R usando seus recursos, especialmente na ausência de seus análogos em MKL.
Você simplesmente não conhece nem o R nem a MQL5.
Você não deu uma olhada nos códigos-fonte do R e não conhece os códigos-fonte da MQL5. Você não criou compiladores nos últimos 15 anos. Mas está tentando argumentar com aqueles que já fizeram tudo isso.
Atualmente, a biblioteca estatística MQL5 (excluindo Alglib, Fuzzy) já tem mais de 461 funções: https://www.mql5.com/ru/forum/86386/page222#comment_3867386.
Isso já cobre bem as funções estatísticas básicas.
Se você já leu o artigo antes, recomendo que o leia novamente - ontem eles lançaram uma nova versão do artigo com muitas funções novas.
Atualmente, a biblioteca estatística MQL5 (excluindo Alglib, Fuzzy) já tem mais de 461 funções: https://www.mql5.com/ru/forum/86386/page222#comment_3867386.
Isso já cobre bem as funções estatísticas básicas.
Recomendo aos que já leram o artigo anteriormente que o leiam novamente - ontem eles lançaram uma nova versão do artigo com muitas funções novas.
Ainda não descobri como enviar uma mensagem push para o Quantum. Por favor, adicione algo que talvez nem esteja no R.
Este é um cálculo rápido do intervalo médio ao deslocá-lo em uma unidade para a direita. Da mesma forma, o cálculo do coeficiente de correlação de Pearson.
Pearson é bastante difícil de calcular, se for de frente. Mas há métodos iterativos de cálculo: K[i] até K[i-1].
É engraçado, é a primeira vez que encontro uma frase em russo com uma vírgula após cada palavra:
Por que você mesmo não escreve a função necessária?
Dê uma olhada nas fontes completas de funções em /include/math/stat e escreva as que estão faltando.
Não há vetorização nem recursos modernos no R. O código é escrito apenas por programadores juniores comuns. Sim, eles são matemáticos decentes, mas são programadores medíocres.
Você simplesmente não conhece nem o R nem a MQL5.
Você não deu uma olhada nos códigos-fonte do R e não conhece os códigos-fonte do MQL5. Você não construiu compiladores nos últimos 15 anos. Mas está tentando argumentar com aqueles que já fizeram tudo isso.
Tenho um conhecimento muito modesto de programação, mas não tanto quanto o que você descreve.
De qualquer forma, entendo perfeitamente que a implementação interna do R em C++ a que você se refere não tem nada a ver com o problema de medir a velocidade de execução que levantei. Estou escrevendo sobre a técnica de escrever código no próprio R, e o que está dentro dele é o que medimos.
Então, sobre vetorização.
Uma string parece normal no R
Ela é sempre, no mínimo, um cálculo vetorial. Depende do contexto - o que são a e b.
Além disso,
dará um vetor c, cada elemento do qual é a raiz quadrada do elemento correspondente do vetor a
Nesse caso, a não precisa ser necessariamente um vetor, pode ser um objeto mais complexo, como uma matriz.
Em MQL, esses objetos são sempre ciclos.
Além disso, a vetorização em R implica não apenas os objetos em si, mas também
E voltando ao significado do que escrevi na postagem anterior.
Eu não escrevo nada sobre a qualidade da implementação das funções C++. Como você, proponho medi-las como elas são. Mas usando as ferramentas da linguagem R, que são especialmente destinadas a operações vetorizadas.
Por exemplo.
Para todos os seus testes, forme uma matriz M com 100 (como você fez), em que cada coluna modela uma citação
Em seguida, no R, o mínimo de todas as colunas tem a seguinte aparência
O resultado será um vetor que contém o mínimo de cada coluna
Usando esse padrão, precisamos medir a taxa de todas as funções de distribuição envolvidas na aplicação apropriada. Há muitas delas e elas são diferentes. Não há análogos no MKL.
Ao mesmo tempo, certifique-se de que a biblioteca MKL esteja instalada junto com o R.
Por que você mesmo não escreve a função necessária?
Dê uma olhada nas fontes de funções completas em /include/math/stat e escreva as que estão faltando.
Uma ideia interessante.
Talvez você possa encontrar um executor para portar pacotes. Por exemplo, splines. Ele tem mashups de alta qualidade, o verdadeiro negócio.
Tenho um conhecimento muito modesto de programação, mas não na extensão que você descreve.
De qualquer forma, entendo perfeitamente que a implementação interna em C++ do R a que você se refere não tem nada a ver com o problema de medir a velocidade de execução que levantei. Estou escrevendo sobre a técnica de escrever código no próprio R, e o que está dentro dele é o que medimos.
Então, sobre a vetorização.
No R, uma string parece normal
É sempre, no mínimo, um cálculo de vetorização. Depende do contexto - o que são a e b.
Além disso,
dará um vetor c, cada elemento do qual é a raiz quadrada do elemento correspondente do vetor a
Nesse caso, a não precisa necessariamente ser um vetor, pode ser um objeto mais complexo, como uma matriz.
Em MQL, esses objetos são sempre ciclos.
Já mostramos como trabalhar mais rápido em loops. E em fontes puras em MQL5 sem usar C++.
E também derrotaremos o vetor sqrt mais simples. Aqui estão duas funções padrão da biblioteca com um análogo completo do R:
bool MathSqrt(const double &array[],double &result[]) // resultado em um vetor separado
Você ainda não entendeu que essas 461 funções da biblioteca padrão de matemática MQ5 têm uma enorme cobertura de operações matemáticas básicas.
Além disso, a vetorização no R implica não apenas os objetos em si, mas também:
Sim, sim. Teoricamente.
E 99% de todas as operações são feitas exclusivamente nas funções mais simples, sem chance de aceleração.
Na MQL5, o OpenCL é padrão e você pode acelerar tudo sem bibliotecas de terceiros. E no MQL5 comum você pode obter resultados no nível do C++.
Mas no R, a única opção é procurar um pacote para acelerar cada ciclo. Sim, exatamente cada ciclo, se for algo em termos do número de iterações.
E voltando ao significado do que escrevi na postagem anterior.
Poucas pessoas se dão conta disso, mas é provável que, ao usar o MKL, haja uma sobrecarga fabulosa ao mover os dados de entrada do R para matrizes regulares nas quais o MKL trabalhará e, em seguida, o resultado deverá ser movido de volta para o formato de representação de dados internos do R.
Não me aprofundei no assunto, mas, logicamente, é o que parece. O que significa grandes despesas para fornecer suporte a MKL.
Na MQL5, não há nenhuma perda desse tipo, é claro. Somente no OpenCL você precisa copiar dados, mas lá é uma memcopia simples e plana.
Por que você mesmo não escreve a função necessária?
Eu a escrevi uma vez, mas não a formatei como uma função matemática.
Dê uma olhada nas fontes completas das funções em /include/math/stat e escreva as que estão faltando.
A questão é colocá-las em uma biblioteca padrão com combinações científicas e de programação, como faz o Quantum.
Muito provavelmente, será necessário fazer uma comparação de desempenho com sua solução. Então, acho que será possível convencer a colocar a bicicleta na biblioteca mat. Eu mesmo não vi isso nos pacotes mat. (não posso dizer o mesmo do R).
Outro pequeno segredo - por que a MQL5 é tão rápida, especialmente quando as bibliotecas estão totalmente no código-fonte.
Nosso compilador está envolvido em uma otimização tão profunda e tem a capacidade de cortar tantas verificações e condições que as funções desaparecem completamente e os loops são simplificados ao extremo. Obviamente, apenas para a versão x64.
Ao contrário do uso de bibliotecas/pacotes (em que você não pode nem mesmo otimizar uma chamada) por outros sistemas, o compilador MQL5 quase sempre trabalha com o código-fonte completo e sempre executa a otimização global até a profundidade máxima. Isso proporciona resultados surpreendentes.
É por isso que é importante para nós fornecer todas as bibliotecas padrão no código-fonte. Sabemos que, nas finais, tudo será superotimizado para que você possa superar quase todos em termos de velocidade. E até mesmo a sobrecarga na linguagem gerenciada não afetará mais tanto.