Test del nuovo compilatore MQL5 per piattaforme x64 - calcoli da 2 a 10 volte più veloci!

 

Come abbiamo promesso in precedenza, stiamo rilasciando un nuovo compilatore MQL5 ottimizzato per la versione a 64 bit di MetaTrader 5.

Abbiamo mantenuto la piena compatibilità del codice generato sia per le versioni a 32 bit del terminale che per le vecchie versioni dei terminali.

È già possibile aggiornare a MetaTrader 5 build 1108 con le sue nuove funzionalità sul nostro server MetaQuotes-Demo. Per abilitare il nuovo compilatore ottimizzante, aggiungete la chiave Optimize=1 a [Experts] in metaeditor.ini:

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


Per testare le prestazioni dei compilatori MQL4, MQL5 e C++, abbiamo usato i test standard dei compilatori. Tutti i file sorgente sono allegati insieme al foglio di calcolo Excel, così tutti possono ricontrollare.

Per ora diamo un'occhiata ai risultati del test nel seguente ambiente:

  • Intel Xeon E5-2687W v3 @3.10 Ghz, 20 core, 32 Gb DDR4 2100
  • MQL4 su MetaTrader 4 build 794
  • MQL5 su MetaTrader 5 build 1111 x64, modalità normale
  • MQL5 su MetaTrader 5 build 1111 x64, nuovo compilatore, modalità Optimize=1
  • C++ con Visual Studio 2012 Update 4, codice x64, massima ottimizzazione
  • Tempo in millisecondi, meno è meglio è

TestMT4 794MT5 1111 x64
MT5 1111 NuovoC++ x64Commento di
TestAckermann 3718 3109 0 0 Perfetto, i due compilatori sono stati in grado di ottimizzare i calcoli di compilazione buttando fuori tutto il codice
TestArrays 15063 2531 203 31 C'è ancora spazio per migliorare
TestBubbleSort 10609 2484 656 860 Sorprendentemente, MQL5 ha tirato avanti nell'ordinamento della bolla
TestCall 922 891 0 0 Perfetto, i due compilatori sono stati in grado di ottimizzare i calcoli di compilazione buttando fuori tutto il codice
TestFibo 2547 1187 0 0 Perfetto, i due compilatori sono stati in grado di ottimizzare i calcoli di compilazione buttando fuori tutto il codice
TestMatrix 15375 4359 422 281 C'è ancora spazio per migliorare
TestMoments 5719 4323 4078 0 Forse, includendo più metodi di ottimizzazione, saremo in grado di cestinare il codice come MSVC
TestNestedLoop 6219 6141 0 0 Perfetto, i due compilatori sono stati in grado di ottimizzare i calcoli di compilazione buttando fuori tutto il codice
TestPiCalculated 5047 3500 1875 1859 Naso a naso con MSVC
TestRandom 2375 1828 468 438 Quasi buono come MSVC
TestSieve 13578 4031 875 515 Chiudere
TestString 187 218 422 266 Ottimizzare e superare MSVC, questo è un flop temporaneo dovuto all'insufficiente ottimizzazione
TestStrPrep 3938 3328 1703 1875 Più veloce di MSVC
TestStrRev 4000 3141 2719 438 Dobbiamo capirlo.
TestStrSum 5344 2812 2844 0 Forse, aggiungendo altri metodi di ottimizzazione, saremo in grado di eliminare il codice come in MSVC


Per vedere il grafico dettagliato, cliccate su di esso.


Quali sono le conclusioni:

  1. MQL4 sta seriamente perdendo contro MQL5 anche sulla base di un compilatore

    MQL5 è più veloce di MQL4 da decine di percentuali fino a diverse volte. La ragione è nell'ambiente di esecuzione e nei 32 bit. MetaTrader 5 ha un runtime molto più efficiente e in costante sviluppo.

  2. Il nuovo compilatore MQL5 a 64 bit è da 2 a 10 volte più veloce dell'attuale MQL5

    Lo sviluppo del nuovo compilatore ha richiesto molto tempo, ma i guadagni sono stati sorprendenti. Ci sono alcuni problemi con l'ottimizzazione delle operazioni sulle stringhe, ma cercheremo anche di velocizzarle.

  3. Il nuovo compilatore è molto vicino alla qualità e alla velocità del compilatore Visual Studio 2012 x64.

    Non abbiamo ancora attivato tutti i metodi di ottimizzazione perché li stiamo ancora testando. Quindi i risultati continueranno a migliorare.


Cosa dà ai commercianti?

La possibilità di fare più calcoli nella stessa quantità di tempo e meno pensare di passare a una DLL. Questo è particolarmente importante per coloro che fanno la matematica pesante.

 

Ben fatto!

 

Professionisti nel loro campo!

Grazie!

 

Inoltre - il prossimo rilascio entro il 20 maggio avrà molto probabilmente un debugger disponibile sui dati storici.

Lo mostreremo all'iFX Expo il 26-28 maggio.

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. Il nuovo compilatore MQL5 a 64 bit è da 2 a 10 volte più veloce dell'attuale compilatore MQL5.

    Lo sviluppo del nuovo compilatore ha richiesto molto tempo, ma i guadagni sono stati sorprendenti. Ci sono alcuni problemi con l'ottimizzazione delle operazioni sulle stringhe, ma cercheremo anche di velocizzarle.

  2. Il nuovo compilatore è molto vicino alla qualità e alla velocità del compilatore Visual Studio 2012 x64.

    Non abbiamo ancora attivato tutti i metodi di ottimizzazione perché li stiamo ancora testando. Pertanto, i risultati continueranno a migliorare.


Inoltre, un debugger sui dati storici sarà molto probabilmente disponibile nella prossima release entro il 20 maggio.

Lo dimostreremo all'iFX Expo il 26-28 maggio.

Una notizia molto gradita, grazie!
 
Grazie, vi auguro ulteriore successo!
 
Renat Fatkhullin:

Il nuovo compilatore si avvicina molto alla qualità e alla velocità del compilatore Visual Studio 2012 x64

Non abbiamo ancora attivato tutti i metodi di ottimizzazione perché li stiamo ancora testando. Ecco perché i risultati continueranno a migliorare.

Buone notizie! Ben fatto!

Renat Fatkhullin:

Potete eseguire più calcoli allo stesso tempo e pensare meno a passare alla DLL. Questo è particolarmente importante per coloro che fanno matematica pesante.


Sì, non riesco davvero a pensare a nessun altro compito in cui siano necessarie DLL esterne.


Renat Fatkhullin:

Inoltre - la prossima release entro il 20 maggio avrà molto probabilmente un debugger disponibile sui dati storici.

Questa è davvero la caratteristica più utile. Grazie mille, davvero.

Personalmente ho solo una domanda: i puntatori agli array. Per gli array privati il problema si risolve avvolgendo un array in una classe.

Ma per gli array passati nella funzione OnCalculate() devo copiare i dati nei buffer interni ogni volta, e solo allora passare i puntatori negli oggetti analyzer e nei gestori. Una volta ho provato a passare i puntatori usando memcpy, ma in qualche modo la velocità era quasi la stessa, e secondo me, tali "trucchi" non dovrebbero essere applicati.

Forse la possibilità di usare il tipo di riferimento sarebbe più accettabile. In generale, il compito è quello di accedere agli elementi dell'array senza copiarli.

 
George Merts:

Sì, non riesco a pensare a nessun altro compito in cui siano necessarie DLL esterne.

Per esempio, le comunicazioni interterminali.
 
Ho provato a compilare uno dei miei robot con l'ottimizzazione.
Si è scoperto che l'assegnazione del parametro di input di deviazione al campo di deviazione dell'istanza della struttura MqlTradeRequest porta all'errore di generazione del codice.
Esempio ipotetico (tutto il resto è stato rimosso):
sinput ulong deviation = 100;
int OnInit()
  {
        MqlTradeRequest request =
        {
                0
        };
        request.deviation = deviation;
//---
   return(INIT_SUCCEEDED);
  }

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
Ottengo"errore di generazione del codice 1 1".

Se si assegna solo "100":

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

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

...allora la compilazione andrà avanti senza errori. Nota, ho un processore AMD Athlon II X4 645, 3.1 GHz. Forse è importante (proprio questa settimana MQL4 con servicedesk ha catturato alcuni bug su AMD).

Il mio compilatore non si lamenta di nient'altro.

 
Grazie per aver segnalato l'errore - lo sistemeremo.
Motivazione: