Testen des neuen MQL5-Compilers für x64-Plattformen - 2 bis 10 Mal schnellere Berechnungen!

 

Wie wir bereits versprochen haben, veröffentlichen wir einen neuen MQL5-Compiler, der für die 64-Bit-Version von MetaTrader 5 optimiert ist.

Wir haben die volle Kompatibilität des generierten Codes sowohl für 32-Bit-Versionen des Terminals als auch für ältere Versionen der Terminals beibehalten.

Sie können bereits auf unserem MetaQuotes-Demo-Server ein Upgrade auf MetaTrader 5 Build 1108 mit seinen neuen Funktionen durchführen. Um den neuen optimierenden Compiler zu aktivieren, fügen Sie den Schlüssel Optimize=1 zu [Experts] in metaeditor.ini hinzu:

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


Um die Leistung von MQL4, MQL5 und C++-Compilern zu testen, haben wir Standard-Compilertests verwendet. Alle Quelldateien sind zusammen mit einer Excel-Tabelle beigefügt, damit jeder sie überprüfen kann.

Schauen wir uns nun die Testergebnisse in der folgenden Umgebung an:

  • Intel Xeon E5-2687W v3 @3,10 Ghz, 20 Kerne, 32 Gb DDR4 2100
  • MQL4 auf MetaTrader 4 build 794
  • MQL5 auf MetaTrader 5 build 1111 x64, normaler Modus
  • MQL5 auf MetaTrader 5 build 1111 x64, neuer Compiler, Optimize=1 Modus
  • C++ mit Visual Studio 2012 Update 4, x64-Code, maximale Optimierung
  • Zeit in Millisekunden, je weniger, desto besser

TestMT4 794MT5 1111 x64
MT5 1111 NeuC++ x64Kommentar von
TestAckermann 3718 3109 0 0 Perfekt, die beiden Compiler waren in der Lage, die Kompilierungsberechnungen zu optimieren, indem sie den gesamten Code verwarfen
TestArrays 15063 2531 203 31 Es gibt noch Raum für Verbesserungen
TestBubbleSort 10609 2484 656 860 Überraschenderweise hat MQL5 bei der Sortierung der Blase die Nase vorn.
TestAufruf 922 891 0 0 Perfekt, die beiden Compiler waren in der Lage, die Kompilierungsberechnungen zu optimieren, indem sie den gesamten Code verwarfen
TestFibo 2547 1187 0 0 Perfekt, die beiden Compiler waren in der Lage, die Kompilierungsberechnungen zu optimieren, indem sie den gesamten Code verwarfen
TestMatrix 15375 4359 422 281 Es gibt noch Raum für Verbesserungen
TestMomente 5719 4323 4078 0 Wenn wir mehr Optimierungsmethoden einbeziehen, können wir den Code vielleicht wie MSVC verwerfen
TestNestedLoop 6219 6141 0 0 Perfekt, die beiden Compiler waren in der Lage, die Kompilierungsberechnungen zu optimieren, indem sie den gesamten Code verwarfen
TestPiCalculated 5047 3500 1875 1859 Nase an Nase mit MSVC
TestRandom 2375 1828 468 438 Fast so gut wie MSVC
TestSieve 13578 4031 875 515 Schließen Sie
TestString 187 218 422 266 Optimieren und überholen Sie MSVC, dies ist ein vorübergehender Flop aufgrund unzureichender Optimierung
TestStrPrep 3938 3328 1703 1875 Schneller als MSVC
TestStrRev 4000 3141 2719 438 Wir müssen es herausfinden.
TestStrSum 5344 2812 2844 0 Möglicherweise können wir durch Hinzufügen weiterer Optimierungsmethoden den Code wie in MSVC eliminieren


Um die detaillierte Tabelle zu sehen, klicken Sie bitte auf sie.


Was sind die Schlussfolgerungen?

  1. MQL4 ist ernsthaft verlieren zu MQL5 auch auf der Grundlage einer Compiler

    MQL5 ist um mehrere Dutzend Prozentpunkte schneller als MQL4. Der Grund liegt in der Ausführungsumgebung und den 32 Bit. MetaTrader 5 verfügt über eine wesentlich effizientere und sich ständig weiterentwickelnde Laufzeitumgebung.

  2. Der neue 64-Bit-MQL5-Compiler ist 2 bis 10 Mal schneller als der aktuelle MQL5

    Die Entwicklung des neuen Compilers hat viel Zeit in Anspruch genommen, aber der Gewinn war erstaunlich. Es gibt einige Probleme mit der Optimierung von String-Operationen, aber wir werden versuchen, auch diese zu beschleunigen.

  3. Der neue Compiler kommt der Qualität und Geschwindigkeit des Visual Studio 2012 x64 Compilers sehr nahe.

    Wir haben noch nicht alle Optimierungsmethoden aktiviert, da wir sie noch testen. Daher werden sich die Ergebnisse weiter verbessern.


Was bringt sie den Händlern?

Die Möglichkeit, mehr Berechnungen in der gleichen Zeit durchzuführen und weniger über den Wechsel zu einer DLL nachzudenken. Dies ist besonders wichtig für diejenigen, die viel rechnen.

 

Gut gemacht!

 

Fachleute auf ihrem Gebiet!

Ich danke Ihnen!

 

Außerdem wird die nächste Version bis zum 20. Mai höchstwahrscheinlich über einen Debugger für historische Daten verfügen.

Wir werden es auf der iFX Expo vom 26. bis 28. Mai zeigen.

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. Der neue 64-Bit-MQL5-Compiler ist 2 bis 10 Mal schneller als der aktuelle MQL5-Compiler.

    Die Entwicklung des neuen Compilers hat viel Zeit in Anspruch genommen, aber die Fortschritte sind erstaunlich. Es gibt einige Probleme mit der Optimierung von String-Operationen, aber wir werden versuchen, auch diese zu beschleunigen.

  2. Der neue Compiler kommt der Qualität und Geschwindigkeit des Visual Studio 2012 x64 Compilers sehr nahe.

    Wir haben noch nicht alle Optimierungsmethoden aktiviert, da wir sie noch testen. Daher werden sich die Ergebnisse weiter verbessern.


Darüber hinaus wird in der nächsten Version voraussichtlich ab dem 20. Mai ein Debugger für historische Daten verfügbar sein.

Wir werden es auf der iFX Expo vom 26. bis 28. Mai vorführen.

Sehr willkommene Neuigkeiten, danke!
 
Vielen Dank, ich wünsche Ihnen weiterhin viel Erfolg!
 
Renat Fatkhullin:

Der neue Compiler kommt der Qualität und Geschwindigkeit des Visual Studio 2012 x64 Compilers sehr nahe

Wir haben noch nicht alle Optimierungsmethoden aktiviert, da wir sie noch testen. Aus diesem Grund werden sich die Ergebnisse weiter verbessern.

Gute Nachrichten! Gut gemacht!

Renat Fatkhullin:

Sie können mehr Berechnungen gleichzeitig durchführen und denken weniger über den Wechsel zu DLL nach. Dies ist besonders wichtig für diejenigen, die viel rechnen.


Ja, ich kann mir wirklich keine weiteren Aufgaben vorstellen, für die externe DLLs benötigt werden.


Renat Fatkhullin:

Außerdem wird die nächste Version bis zum 20. Mai höchstwahrscheinlich über einen Debugger für historische Daten verfügen.

Dies ist wirklich die nützlichste Funktion. Ich danke Ihnen vielmals.

Persönlich habe ich nur eine Frage - Zeiger auf Arrays. Für private Arrays wird das Problem gelöst, indem man ein Array in eine Klasse einpackt.

Aber für Arrays, die an die OnCalculate()-Funktion übergeben werden, muss ich die Daten jedes Mal in interne Puffer kopieren und erst dann Zeiger an Analyzer-Objekte und Handler übergeben. Einmal habe ich versucht, Zeiger mit memcpy zu übergeben, aber irgendwie war die Geschwindigkeit fast die gleiche, und meiner Meinung nach, solche "Tricks" sollte nicht angewendet werden.

Vielleicht wäre die Möglichkeit, einen Referenztyp zu verwenden, akzeptabler. Im Allgemeinen besteht die Aufgabe darin, auf Array-Elemente zuzugreifen, ohne sie zu kopieren.

 
George Merts:

Ja, realistischerweise kann ich mir keine weiteren Aufgaben vorstellen, für die externe DLLs benötigt werden.

Zum Beispiel die Kommunikation zwischen den Terminals.
 
Ich habe versucht, einen meiner Roboter mit Optimierung zu kompilieren.
Es stellte sich heraus, dass die Zuweisung des Abweichungs-Eingabeparameters an das Abweichungsfeld der MqlTradeRequest-Strukturinstanz zu einem Fehler bei der Codegenerierung führt.
Hypothetisches Beispiel (alles andere wurde entfernt):
sinput ulong deviation = 100;
int OnInit()
  {
        MqlTradeRequest request =
        {
                0
        };
        request.deviation = deviation;
//---
   return(INIT_SUCCEEDED);
  }

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
Ich erhalte"Codegenerierungsfehler 1 1".

Wenn Sie nur "100" zuweisen:

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

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

...dann läuft die Kompilierung ohne Fehler ab. Hinweis: Ich habe einen AMD Athlon II X4 645, 3,1 GHz Prozessor. Vielleicht ist es wichtig (gerade diese Woche MQL4 mit servicedesk haben einige Fehler auf AMD gefangen).

Mein Compiler beschwert sich nicht über andere Dinge.

 
Danke, dass Sie den Fehler gemeldet haben - wir werden ihn beheben.