Discussion de l'article "Faites la Promotion de vos Projets de Développement à l'Aide des Bibliothèques EX5"

 

Un nouvel article Faites la Promotion de vos Projets de Développement à l'Aide des Bibliothèques EX5 a été publié :

Cacher les détails d'implémentation des classes/fonctions dans un fichier .ex5 vous permettra de partager vos algorithmes de savoir-faire avec d'autres développeurs, de mettre en place des projets communs et de les promouvoir sur le Web. Et tandis que l'équipe MetaQuotes ne ménage aucun effort pour amener la possibilité d'héritage direct des classes de la bibliothèque ex5, nous allons l'implémenter dès maintenant.

Nous pouvons maintenant inclure le fichier d'en-tête et importer son implémentation dans notre Expert Advisor subséquent.

Ceci peut être schématisé comme suit :

Schéma d’opération avec les méthodes de classes de librairie

Auteur : ---

 
Bien sûr, si votre travail principal porte sur les fonctions de savoir-faire, il n'est pas nécessaire de créer à l'avance des classes d'enveloppe ISuperClass pour ces fonctions. Il suffit d'exporter ces fonctions de savoir-faire et de laisser un programmeur tiers créer ses propres classes enveloppantes, dont il pourra facilement hériter par la suite.

Ai maladitsa, tu t'es énervé, tu t'es corrigé, un autre plug alors que nous ne sommes pas bien.

Il y a un an, je souffrais aussi de cela, j'avais beaucoup d'enthousiasme. Des obstacles ? non, je n'en ai pas vu. Mais peut-être que je suis juste d'humeur post-fêtes ... :(

Quel est le coût de l'appel aux fonctions de la bibliothèque par rapport au coût de l'appel aux fonctions de la classe native ?

Il ne s'agit pas d'un simple wrapper, il faut appeler la bibliothèque à chaque éternuement.

 
Urain:

Tant mieux pour toi, tu t'es pissé dessus, tu t'es réparé, encore un bouchon alors que nous n'allons pas très bien.

En fait, ce n'est pas si mal ici.

C'est un bon article. J'utilise des librairies tout le temps - c'est la seule façon de séparer le code normalement jusqu'à présent.

Vous feriez mieux de me dire quand il y aura des méga-neurones universels ?

 

Urain:

Quel est le coût d'appel des fonctions de la bibliothèque par rapport au coût d'appel des fonctions de la classe native ?

J'ai vérifié, il n'y a pas de différence.

L'appel de la fonction Test empty lors de l'importation ou de l'inclusion n'affecte pas le temps.

/*
#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:

En fait, la situation n'est pas si mauvaise que cela.

L'article va droit au but. J'utilise des librairies tout le temps - c'est le seul moyen de séparer le code correctement jusqu'à présent.

Quand y aura-t-il des méga-neurones universels ?

Quand les vôtres le seront-ils ?

Franchement, je vais lire un peu plus vos posts et abandonner complètement MT5.

J'en ai marre de toutes ces béquilles jusqu'au plus profond de mon âme, où que je me tourne tout est foireux, "et ils vont démarrer le tram" :)

Neuronka traîne quelque part, si vous avez sérieusement l'envie de vous asseoir il reste un peu de travail, mais pas d'envie.

 
sergeev:

J'ai vérifié, il n'y a pas de différence.

un tel appel du test vide lors de l'importation ou de l'inclusion n'affecte pas le temps.

Comme on dit, sentez la différence :

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

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

//+------------------------------------------------------------------+
//|Test.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:

Comme on dit, sentez la différence :

Non, vous posez une question sur un appel de fonction, n'est-ce pas ?

Ou voulez-vous vérifier la vitesse d'exécution d'une boucle ?

J'ai vérifié la différence entre un simple appel de fonction ou un appel de ex5 bible. Il n'y a pas de différence dans la vitesse des appels de fonction.


Il est clair qu'une boucle vide sans appel de fonction fonctionnera plus rapidement.

 
sergeev:

Non, vous posez une question sur un appel de fonction, n'est-ce pas ?

Ou voulez-vous vérifier la vitesse d'exécution de la boucle en général ?

J'ai vérifié la différence entre un simple appel de fonction et un appel de ex5 bible. Il n'y a pas de différence dans la vitesse des appels de fonction.


Il est clair qu'une boucle vide sans appel de fonction fonctionnera plus rapidement.

Les boucles sont les mêmes, les actions exécutées à l'intérieur des boucles sont les mêmes (dans un cas directement dans la boucle dans l'autre cas à l'intérieur de la fonction) la différence de temps donne le temps net de l'appel de fonction de la lib.

Pour la pureté de l'expérience, décrivons une fonction similaire directement dans le fichier :

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

//+------------------------------------------------------------------+
//|Test.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));   
  }

Pour exclure l'erreur, j'ai même réécrit la longueur de la boucle à partir d'une variable count, le résultat est le même.

 

J'ai 4.5 fois

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

 
sergeev:

J'ai 4.5 fois

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

Alex, ce n'est pas assez pour vous ?

4 fois là, 2 fois là, etc.

Si nous commençons à écrire des bibles basées sur des bibles, les freins vont grossir comme une boule de neige.

Ce schéma peut être utilisé à condition que la bible elle-même n'utilise pas l'appel bible.

 

La différence de vitesse de l'exemple ci-dessus est due au fait que, dans un cas, l'optimiseur de code a complètement surligné une fonction aussi simple et a complètement exclu l'appel de la fonction elle-même, alors que dans l'autre cas, il a été forcé d'appeler honnêtement une fonction externe.

Il faut toujours tenir compte de l'influence inévitable de l'optimiseur de code dans les tests. Cet exemple de boucle dégénère en res=100 ; dans un compilateur décent dans le cas d'une fonction locale.

Essayez d'agrandir la fonction appelée pour éviter l'inlining et testez-le à nouveau.