Discusión sobre el artículo "Promocione sus proyectos de desarrollo usando las librerías EX5"

 

Artículo publicado Promocione sus proyectos de desarrollo usando las librerías EX5:

Ocultar los detalles de la implementación de las clases/funciones en un archivo .ex5 le permitirá compartir sus algoritmos propios con otros desarrolladores, iniciar proyectos y promocionarlos en la Web. Y mientras el equipo de MetaQuotes no escatima esfuerzos para tener la posibilidad de heredar directamente las clases de las librerías ex5, vamos a implementarlas ahora.

Esquema para el trabajo con métodos de las clases de la librería

Autor: o_O

 
Por supuesto, si su trabajo principal será en funciones know-how, no es necesario hacer envolturas ISuperClass para ellos de antemano. Basta con exportar esas mismas funciones know-how y dejar que un programador de terceros cree sus propias clases envoltorio, que pueden ser fácilmente heredadas más tarde.

Ai maladitsa, te has meado, te has corregido, otro enchufe mientras no vamos bien.

Hace un año yo también sufría de esto, tenía mucho entusiasmo. ¿Obstáculos? No, no he visto ninguno. Aunque a lo mejor es que estoy de humor postvacacional .... :(

¿Cuál es el coste de llamar a funciones de librería comparado con el coste de llamar a funciones de clases nativas?

No es un simple wrapper, hay que llamar a la librería en cada estornudo.

 
Urain:

Bien por ti, te has meado, te has corregido, otro tapón mientras no nos va tan bien.

En realidad, no es tan malo aquí.

Es un buen artículo. Yo uso libs todo el tiempo -- es la unica forma de separacion de codigo normal hasta ahora.

Será mejor que me digas -- ¿cuándo habrá meganeuronas universales?

 

Urain:

¿Cuál es el coste de llamar a funciones de biblioteca comparado con el coste de llamar a funciones de clases nativas?

Lo he comprobado, no hay diferencia.

Esta llamada de la función Test empty al importar o incluir no afecta al tiempo.

/*
#import "Graph.ex5"
 void Test(long achart,string name,int awnd,int ax,int ay,color 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:

En realidad, no es para tanto.

El artículo va al grano. Yo uso libs todo el tiempo -- es la única manera de separar el código correctamente hasta ahora.

¿Cuándo habrá meganeuronas universales?

¿Cuándo serán las suyas?

Francamente hablando, leeré un poco más tus posts y dejaré MT5 por completo.

Estoy harto de todas estas muletillas hasta el tuétano del alma, mire donde mire todo está estropeado, "y van a poner en marcha el tranvía" :)

Neuronka está por ahí tirado, si te pones en serio con ganas de sentarte queda una figurita de trabajo, pero sin ganas.

 
sergeev:

Lo he comprobado, no hay ninguna diferencia.

tal llamada de la Prueba vacía al importar o incluir no afecta el tiempo.

Como se suele decir, sentir la diferencia:

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

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

//+------------------------------------------------------------------+
//|Prueba.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 suele decir, siente la diferencia:

No, preguntas por una llamada a una función, ¿no?

¿O querías comprobar la velocidad de ejecución de un bucle?

He comprobado la diferencia entre una simple llamada a función o una llamada de ex5 bible. No hay diferencia en la velocidad de las llamadas a función.


Está claro que un bucle vacío sin una llamada a función funcionará más rápido. para qué comprobarlo.

 
sergeev:

No, preguntas por una llamada a función, ¿no?

¿O quería comprobar la velocidad de ejecución del bucle en general?

He comprobado la diferencia entre una simple llamada a función o una llamada de ex5 bible. No hay diferencia en la velocidad de las llamadas a función.


Está claro que un bucle vacío sin una llamada a función funcionará más rápido. para qué comprobarlo.

Los bucles son los mismos, las acciones ejecutadas dentro de los bucles son las mismas (en un caso directamente en el bucle en el otro caso dentro de la función) la diferencia de tiempo da el tiempo neto de llamada a función desde la lib.

Para la pureza del experimento, vamos a describir una función similar directamente en el archivo:

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

//+------------------------------------------------------------------+
//|Prueba.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 el error, incluso reescribí la longitud del bucle de una cuenta variable, el resultado es el mismo.

 

Tengo 4,5 veces

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

 
sergeev:

Tengo 4,5 veces

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

Alex no es esto suficiente para usted?

4 veces ahí, 2 veces ahí, etc.

Si empezamos a escribir biblias basadas en biblias, los frenos crecerán como una bola de nieve.

Este esquema se puede utilizar siempre que la propia biblia no utilice la llamada biblia.

 

La diferencia en la velocidad del ejemplo anterior se debe a que, en un caso, el optimizador de código sobrelineó completamente una función tan sencilla y excluyó por completo incluso la propia llamada a la función, mientras que en el otro caso se vio obligado a llamar honestamente a una función externa.

Siempre hay que tener en cuenta la inevitable influencia del optimizador de código en las pruebas. Este ejemplo de bucle degenera en res=100; en un compilador decente en el caso de una función local.

Intenta hacer la función llamada más grande para evitar el inlining y vuelve a probarlo.