Discussão do artigo "Promova seus projetos de desenvolvimento utilizando bibliotecas EX5"

 

Novo artigo Promova seus projetos de desenvolvimento utilizando bibliotecas EX5 foi publicado:

Ocultando os detalhes de implementação de classes/funções em um arquivo .ex5 vai permitir que você compartilhe seus algoritmos experientes com outros desenvolvedores, defina projetos comuns e promova-os na Internet. E enquanto a equipe MetaQuotes não mede esforços para viabilizar a possibilidade de herança direta de classes de biblioteca ex5, vamos implementá-la agora.

Esquema para trabalhar com métodos de classes de biblioteca

Autor: o_O

 
Obviamente, se seu trabalho principal for em funções de know-how, não é necessário criar wrappers ISuperClass para elas antecipadamente. É suficiente exportar essas funções de know-how e permitir que um programador de terceiros crie suas próprias classes de wrapper, que podem ser facilmente herdadas posteriormente.

Ai maladitsa, você se irritou, você se corrigiu, outro plug enquanto não estamos indo bem.

Há um ano, eu também estava sofrendo com isso, tinha muito entusiasmo. Obstáculos? Não, não vi nenhum. Embora talvez eu esteja apenas em um estado de espírito pós-férias ... :(

Qual é o custo de chamar funções de biblioteca em comparação com o custo de chamar funções de classe nativa?

Não se trata apenas de um simples invólucro, você precisa chamar a biblioteca a cada espirro.

 
Urain:

Bom para você, você se mijou, se consertou, outra tomada enquanto não estamos indo tão bem.

Na verdade, não está tão ruim aqui.

É um bom artigo. Eu uso bibliotecas o tempo todo - é a única forma de separação normal de código até agora.

É melhor você me dizer: quando haverá mega-neurônios universais?

 

Urain:

Qual é o custo de chamar funções de biblioteca em comparação com o custo de chamar funções de classe nativa?

Eu verifiquei, não há diferença.

Essa chamada da função Test empty ao importar ou incluir não afeta o tempo.

/*
#import "Graph.ex5"
 void Test(long achart,string name,int awnd,int ax,int ay,colour aclr);
#import
*/
#include "Graph.mq5"
void OnStart()
{
  long a=GetTickCount();
  for (int i=0; i<1000000; i++) 
  {
    Test(0, "qwe", 0, 10, 10, clrRed);
  }
  Print(string(GetTickCount()-a));
}
 
TheXpert:

Na verdade, não é tão ruim aqui.

O artigo vai direto ao ponto. Eu uso bibliotecas o tempo todo - é a única maneira de separar o código corretamente até agora.

Quando haverá mega-neurônios universais?

Quando os seus serão?

Falando francamente, lerei suas postagens um pouco mais e desistirei completamente do MT5.

Estou farto de todas essas muletas até o âmago da minha alma, onde quer que eu me vire, tudo está bagunçado, "e eles vão começar o bonde" :)

A Neuronka está por aí em algum lugar, se você estiver seriamente disposto a se sentar, ainda há um fragmento de trabalho, mas sem disposição.

 
sergeev:

Eu verifiquei e não há diferença.

Essa chamada do teste vazio ao importar ou incluir não afeta o tempo.

Como dizem, sinta a diferença:

2012.01.06 16:46:28 Calculadora(EURUSD,H1) empty=281

2012.01.06 16:46:28 Calculadora (EURUSD,H1) lib=2344

//+------------------------------------------------------------------+
//|Teste.mq5 |
//+------------------------------------------------------------------+
#property library
void Test(long achart,string name,int &awnd,int ax,int ay,color aclr) export
   {
    awnd=ax+ay;
   }
//+------------------------------------------------------------------+


#import "Test.ex5"
void Test(long achart,string name,int &awnd,int ax,int ay,color aclr);
#import

void OnStart()
  {
   int res=0;
   long a=GetTickCount();
   for(int i=0; i<100000000; i++)
     {
      Test(0,"qwe",res,10,10,clrRed);
     }
   Print("liba=",string(GetTickCount()-a));
   
   a=GetTickCount();
   for(int i=0; i<100000000; i++)
     {
      res=10+10;
     }
   Print("empty=",string(GetTickCount()-a));   
  }
 
Urain:

Como se costuma dizer, sinta a diferença:

Não, você está perguntando sobre uma chamada de função, não é?

Ou você quer verificar a velocidade de execução do loop?

Verifiquei a diferença entre uma simples chamada de função ou uma chamada do ex5 bible. Não há diferença na velocidade das chamadas de função.


Está claro que um loop vazio sem uma chamada de função funcionará mais rápido. Por que verificar isso?

 
sergeev:

Não, você está perguntando sobre uma chamada de função, não é?

Ou você queria verificar a velocidade de execução do loop em geral?

Verifiquei a diferença entre uma simples chamada de função ou uma chamada do ex5 bible. Não há diferença na velocidade das chamadas de função.


Está claro que um loop vazio sem uma chamada de função funcionará mais rápido.

Os loops são os mesmos, as ações executadas dentro dos loops são as mesmas (em um caso, diretamente no loop; no outro, dentro da função), a diferença de tempo fornece o tempo líquido da chamada de função da biblioteca.

Para a pureza do experimento, vamos descrever uma função semelhante diretamente no arquivo:

2012.01.06 17:18:39 Calculator (EURUSD,H1) empty=281
2012.01.06 17:18:38 Calculator (EURUSD,H1) lib=2281

//+------------------------------------------------------------------+
//|Teste.mq5 |
//+------------------------------------------------------------------+
#property library
void Test(long achart,string name,int &awnd,int ax,int ay,color aclr) export
   {
    awnd=ax+ay;
   }
//+------------------------------------------------------------------+
#import "Test.ex5"
void Test(long achart,string name,int &awnd,int ax,int ay,color aclr);
#import

void Testlocal(long achart,string name,int &awnd,int ax,int ay,color aclr)
   {
    awnd=ax+ay;
   }

void OnStart()
  {
   int res=0; int count=100000000;
   long a=GetTickCount();
   for(int i=0; i<count; i++)
     {
      Test(0,"qwe",res,10,10,clrRed);
     }
   Print("liba=",string(GetTickCount()-a));
   
   a=GetTickCount();
   for(int i=0; i<count; i++)
     {
      Testlocal(0,"qwe",res,10,10,clrRed);
     }
   Print("empty=",string(GetTickCount()-a));   
  }

Para excluir o erro, até reescrevi o comprimento do loop a partir de uma contagem de variáveis, mas o resultado é o mesmo.

 

Eu tenho 4,5 vezes

2012.01.06 17:28:33 test(EURUSD,D1) ex5=2047
2012.01.06 17:28:31 test (EURUSD,D1) local=438

 
sergeev:

Eu tenho 4,5 vezes

2012.01.06 17:28:33 test (EURUSD,D1) ex5=2047
2012.01.06 17:28:31 test (EURUSD,D1) local=438

Alex, isso não é suficiente para você?

4 vezes aqui, 2 vezes aqui, etc.

Se começarmos a escrever bíblias baseadas em bíblias, os freios crescerão como uma bola de neve.

Esse esquema pode ser usado desde que a própria Bíblia não use a chamada da Bíblia.

 

A diferença na velocidade do exemplo acima se deve ao fato de que, em um caso, o otimizador de código superinfinanciou completamente uma função tão simples e excluiu completamente até mesmo a própria chamada da função, enquanto no outro caso ele foi forçado a chamar uma função externa honestamente.

Você deve sempre levar em conta a influência inevitável do otimizador de código nos testes. Esse exemplo de loop se degenera em res=100; em um compilador decente no caso de uma função local.

Tente tornar a função chamada maior para evitar o inlining e teste-a novamente.