Test du nouveau compilateur MQL5 pour les plateformes x64 - calculs 2 à 10 fois plus rapides !

 

Comme nous l'avons promis précédemment, nous publions un nouveau compilateur MQL5 optimisé pour la version 64 bits de MetaTrader 5.

Nous avons conservé une compatibilité totale du code généré tant pour les versions 32 bits du terminal que pour les anciennes versions des terminaux.

Vous pouvez déjà passer à MetaTrader 5 build 1108 avec ses nouvelles fonctionnalités sur notre serveur MetaQuotes-Demo. Afin d'activer le nouveau compilateur d'optimisation, ajoutez la clé Optimize=1 à [Experts] dans metaeditor.ini :

[Experts]
Author=Copyright 2014, MetaQuotes Software Corp.
Address=http://www.mql5.com
Optimize=1


Pour tester les performances de MQL4, MQL5 et des compilateurs C++, nous avons utilisé les tests standards de compilateurs. Tous les fichiers sources sont joints avec la feuille de calcul Excel, afin que chacun puisse les vérifier.

Pour l'instant, examinons les résultats du test dans l'environnement suivant :

  • Intel Xeon E5-2687W v3 @3.10 Ghz, 20 cœurs, 32 Gb DDR4 2100
  • MQL4 sur MetaTrader 4 build 794
  • MQL5 sur MetaTrader 5 build 1111 x64, mode normal
  • MQL5 sur MetaTrader 5 build 1111 x64, nouveau compilateur, mode Optimize=1
  • C++ avec Visual Studio 2012 Update 4, code x64, optimisation maximale
  • Temps en millisecondes, moins il y en a, mieux c'est.

TestMT4 794MT5 1111 x64
MT5 1111 NouveauC++ x64Commentaire de
TestAckermann 3718 3109 0 0 Parfait, les deux compilateurs ont pu optimiser les calculs de compilation en éliminant tout le code
TestArrays 15063 2531 203 31 Des améliorations sont encore possibles
TestBubbleSort 10609 2484 656 860 Étonnamment, MQL5 a pris de l'avance dans le tri à la bulle.
TestCall 922 891 0 0 Parfait, les deux compilateurs ont pu optimiser les calculs de compilation en éliminant tout le code
TestFibo 2547 1187 0 0 Parfait, les deux compilateurs ont pu optimiser les calculs de compilation en éliminant tout le code
TestMatrix 15375 4359 422 281 Des améliorations sont encore possibles
TestMoments 5719 4323 4078 0 Peut-être qu'en incluant plus de méthodes d'optimisation, nous serons en mesure de mettre le code à la poubelle comme MSVC
TestNestedLoop 6219 6141 0 0 Parfait, les deux compilateurs ont pu optimiser les calculs de compilation en éliminant tout le code
TestPiCalculé 5047 3500 1875 1859 Nez à nez avec MSVC
TestRandom 2375 1828 468 438 Presque aussi bon que MSVC
TestSieve 13578 4031 875 515 Fermer
TestString 187 218 422 266 Optimiser et dépasser MSVC, c'est un flop temporaire dû à une optimisation insuffisante
TestStrPrep 3938 3328 1703 1875 Plus rapide que MSVC
TestStrRev 4000 3141 2719 438 Nous devons trouver une solution.
TestStrSum 5344 2812 2844 0 Peut-être qu'en ajoutant plus de méthodes d'optimisation, nous pourrons éliminer le code comme dans MSVC


Pour voir le graphique détaillé, veuillez cliquer dessus.


Quelles sont les conclusions :

  1. MQL4 est sérieusement en perte de vitesse par rapport à MQL5, même sur la base d'un seul compilateur.

    MQL5 est plus rapide que MQL4 de quelques dizaines de pourcentages à plusieurs fois. La raison se trouve dans l'environnement d'exécution et les 32 bits. MetaTrader 5 dispose d'un runtime beaucoup plus efficace et en constante évolution.

  2. Le nouveau compilateur MQL5 64 bits est 2 à 10 fois plus rapide que le compilateur MQL5 actuel.

    Le développement du nouveau compilateur a pris beaucoup de temps, mais les gains ont été étonnants. L'optimisation des opérations sur les chaînes de caractères pose quelques problèmes, mais nous allons essayer de les accélérer également.

  3. Le nouveau compilateur est très proche de la qualité et de la vitesse du compilateur Visual Studio 2012 x64.

    Nous n'avons pas encore activé toutes les méthodes d'optimisation car nous sommes encore en train de les tester. Les résultats continueront donc à s'améliorer.


Que donne-t-il aux commerçants ?

La possibilité d'effectuer plus de calculs dans le même laps de temps et de moins penser à passer à une DLL. C'est particulièrement important pour ceux qui font les gros calculs.

 

Bien joué !

 

Des professionnels dans leur domaine !

Merci !

 

En outre, la prochaine version, prévue pour le 20 mai, comportera très probablement un débogueur disponible pour les données historiques.

Nous le présenterons à l'iFX Expo du 26 au 28 mai.

iFX EXPO International 2015
  • iFX EXPO
  • www.ifxexpo.com
Booth 01 Get the world’s fastest HTML5 chart for mobile & desktop, and the highest user-rated mobile apps - with or without trading. Founded in 1998, NetDania pioneered streaming price technology, and have since delivered solutions to global Tier-1 banks, brokers, currency managers, and analysts. With a strong position within corporate FX and...
 

Renat Fatkhullin:

  1. Le nouveau compilateur MQL5 64 bits est 2 à 10 fois plus rapide que le compilateur MQL5 actuel.

    Le développement du nouveau compilateur a pris beaucoup de temps, mais les gains ont été étonnants. L'optimisation des opérations sur les chaînes de caractères pose quelques problèmes, mais nous allons essayer de les accélérer également.

  2. Le nouveau compilateur est très proche de la qualité et de la vitesse du compilateur Visual Studio 2012 x64.

    Nous n'avons pas encore activé toutes les méthodes d'optimisation car nous sommes encore en train de les tester. Par conséquent, les résultats continueront de s'améliorer.


En outre, un débogueur sur les données historiques sera très probablement disponible dans la prochaine version d'ici le 20 mai.

Nous en ferons la démonstration lors de l'iFX Expo du 26 au 28 mai.

Une nouvelle très appréciée, merci !
 
Merci, je vous souhaite encore beaucoup de succès !
 
Renat Fatkhullin:

Le nouveau compilateur est très proche de la qualité et de la vitesse du compilateur Visual Studio 2012 x64.

Nous n'avons pas encore activé toutes les méthodes d'optimisation car nous sommes encore en train de les tester. C'est pourquoi les résultats continueront de s'améliorer.

Bonne nouvelle ! Bravo !

Renat Fatkhullin:

Vous pouvez effectuer plus de calculs en même temps et penser moins à passer à la DLL. C'est particulièrement important pour ceux qui font beaucoup de mathématiques.


Oui, je ne peux vraiment pas penser à d'autres tâches pour lesquelles des DLL externes sont nécessaires.


Renat Fatkhullin:

En outre, la prochaine version, prévue pour le 20 mai, comportera très probablement un débogueur disponible pour les données historiques.

C'est vraiment la fonction la plus utile. Merci beaucoup.

Personnellement, je n'ai qu'une seule question : les pointeurs sur les tableaux. Pour les tableaux privés, le problème est résolu en enveloppant un tableau dans une classe.

Mais pour les tableaux passés dans la fonction OnCalculate(), je dois copier les données dans des tampons internes à chaque fois, et seulement ensuite passer les pointeurs dans les objets analyseurs et les gestionnaires. Une fois, j'ai essayé de passer des pointeurs en utilisant memcpy, mais la vitesse était presque la même, et à mon avis, de tels "trucs" ne devraient pas être appliqués.

La possibilité d'utiliser un type de référence serait peut-être plus acceptable. En général, la tâche consiste à accéder aux éléments d'un tableau sans les copier.

 
George Merts:

Oui, je ne peux pas vraiment penser à d'autres tâches pour lesquelles des DLL externes sont nécessaires.

Par exemple, les communications inter-terminales.
 
J'ai essayé de compiler un de mes robots avec l'optimisation.
Il s'est avéré que l'affectation du paramètre d'entrée d'écart au champ d'écart de l'instance de structure MqlTradeRequest entraîne une erreur de génération de code.
Exemple hypothétique (tout le reste a été supprimé) :
sinput ulong deviation = 100;
int OnInit()
  {
        MqlTradeRequest request =
        {
                0
        };
        request.deviation = deviation;
//---
   return(INIT_SUCCEEDED);
  }

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
J'obtiens"erreur de génération de code 1 1".

Si vous attribuez simplement "100" :

int OnInit()
  {
        MqlTradeRequest request =
        {
                0
        };
        request.deviation = 100;
//---
   return(INIT_SUCCEEDED);
  }

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }

...alors la compilation se fera sans erreur. Note, j'ai un processeur AMD Athlon II X4 645, 3.1 GHz. C'est peut-être important (cette semaine, MQL4 avec servicedesk a détecté des bogues sur AMD).

Mon compilateur ne se plaint de rien d'autre.

 
Merci d'avoir signalé l'erreur - nous allons la corriger.