Тестирование нового компилятора MQL5 для x64 платформ - ускорение расчетов от 2 до 10 раз!

 

Как мы и обещали ранее, выпускаем новый MQL5 компилятор, оптимизированный для 64 битной версии MetaTrader 5.

Мы сохранили полную совместимость генерируемого кода как для 32 битных версий терминала, так и для старых версий терминалов.

Уже сейчас на нашем демо сервере MetaQuotes-Demo можно обновиться до MetaTrader 5 build 1108, у которого доступен новый функционал. Чтобы включить режим нового оптимизирующего компилятора, надо прописать в metaeditor.ini в раздел [Experts] ключ Optimize=1:

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


Для тестирования производительности компиляторов MQL4, MQL5 и C++ использовались стандартные тесты компиляторов. Все исходные файлы приложены вместе с Excel таблицей результатов, так что каждый может перепроверить сам.

А пока посмотрим на результаты тестов в следующей среде:

  • Intel Xeon E5-2687W v3 @3.10 Ghz, 20 cores, 32 Gb DDR4 2100
  • MQL4 на MetaTrader 4 build 794
  • MQL5 на MetaTrader 5 build 1111 x64, обычный режим
  • MQL5 на MetaTrader 5 build 1111 x64, новый компилятор, режим Optimize=1
  • C++ на   Visual Studio 2012 Update 4, x64 код, максимальная оптимизация
  • время в миллисекундах, чем меньше - тем лучше

TestMT4 794MT5 1111 x64
MT5 1111 NewC++ x64Комментарий
 TestAckermann 3718 3109 0 0  Идеально, два компилятора смогли оптимизировать вычисления при компиляции, выкинув весь код
 TestArrays 15063 2531 203 31  У нас еще есть возможность улучшить результат
 TestBubbleSort 10609 2484 656 860  Удивительно, но в пузырьковой сортировке MQL5 вырвался вперед
 TestCall 922 891 0 0  Идеально, два компилятора смогли оптимизировать вычисления при компиляции, выкинув весь код
 TestFibo 2547 1187 0 0  Идеально, два компилятора смогли оптимизировать вычисления при компиляции, выкинув весь код
 TestMatrix 15375 4359 422 281  У нас еще есть возможность улучшить результат
 TestMoments 5719 4323 4078 0  Возможно, включив еще методы оптимизации, сможем выкинуть код как MSVC
 TestNestedLoop 6219 6141 0 0  Идеально, два компилятора смогли оптимизировать вычисления при компиляции, выкинув весь код
 TestPiCalculated 5047 3500 1875 1859  Ноздря в ноздрю с MSVC
 TestRandom 2375 1828 468 438  Почти одинаково с MSVC
 TestSieve 13578 4031 875 515  Близко
 TestString 187 218 422 266  Оптимизируем и обгоним MSVC, это временный провал из-за недостаточной оптимизации (руки не дошли)
 TestStrPrep 3938 3328 1703 1875  Быстрее, чем MSVC
 TestStrRev 4000 3141 2719 438  Надо разобраться
 TestStrSum 5344 2812 2844 0  Возможно, включив еще методы оптимизации, сможем выкинуть код как MSVC


Чтобы увидеть детальный график, кликните по нему, пожалуйста.


Какие выводы:

  1. MQL4 серьезно проигрывает MQL5 даже базируясь на одном компиляторе

    MQL5 быстрее MQL4 от десятков процентов до нескольких раз. Причина проигрыша в среде исполнения и 32 битах. У MetaTrader 5 гораздо более эффективная и постоянно развиваемая среда исполнения.

  2. Новый 64 битный компилятор MQL5 быстрее текущего MQL5 от 2 до 10 раз

    Разработка нового компилятора заняла очень много времени, но выигрыш оказался потрясающим. Есть вопросы к оптимизации строковых операций, но постараемся и их ускорить.

  3. Новый компилятор вплотную приблизился к качеству и скорости компилятора Visual Studio 2012 x64

    Мы еще не активировали все методы оптимизаций, так как пока занимаемся тестированием. Поэтому результаты еще улучшатся.


Что это дает трейдерам?

Возможность за то же самое время проводить больше расчетов и меньше задумываться о переходе на DLL. Особенно это важно для тех, кто занимается тяжелой математикой.

 

Молодцы!

 

Профессионалы своего дела!

Спасибо! 

 

Еще в дополнение - в следующем релизе к 20 числам мая скорее всего будет доступен отладчик на исторических данных.

Как раз на iFX Expo показывать будем 26-28 мая.

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. Новый 64 битный компилятор MQL5 быстрее текущего MQL5 от 2 до 10 раз

    Разработка нового компилятора заняла очень много времени, но выигрыш оказался потрясающим. Есть вопросы к оптимизации строковых операций, но постараемся и их ускорить.

  2. Новый компилятор вплотную приблизился к качеству и скорости компилятора Visual Studio 2012 x64

    Мы еще не активировали все методы оптимизаций, так как пока занимаемся тестированием. Поэтому результаты еще улучшатся.

 


Еще в дополнение - в следующем релизе к 20 числам мая скорее всего будет доступен отладчик на исторических данных.

Как раз на iFX Expo показывать будем 26-28 мая.

Очень долгожданные новости, спасибо!
 
Спасибо, желаю дальнейших успехов!
 
Renat Fatkhullin:
 

Новый компилятор вплотную приблизился к качеству и скорости компилятора Visual Studio 2012 x64

Мы еще не активировали все методы оптимизаций, так как пока занимаемся тестированием. Поэтому результаты еще улучшатся.

Хорошая новость ! Отлично !

Renat Fatkhullin:

Возможность за то же самое время проводить больше расчетов и меньше задумываться о переходе на DLL. Особенно это важно для тех, кто занимается тяжелой математикой.


Да, реально я уже не могу придумать таких задач, в которых были бы необходимы внешние DLL.


Renat Fatkhullin:

Еще в дополнение - в следующем релизе к 20 числам мая скорее всего будет доступен отладчик на исторических данных.

А вот это - реально самая нужная фишка. За это - действительно огромное спасибо.

Лично у меня остается один вопрос - указатели на массивы.  Для приватных массивов задача решается оборачиванием массива в класс.

Но вот для массивов, передаваемых в функцию OnCalculate() приходится каждый раз сперва копировать данные во внутренние буффера, а лишь потом передавать указатели внутрь объектов-анализаторов и обработчиков. Когда-то я пытался передавать указатели с использованием memcpy, но скорость почему-то была почти одинаковой, да и подобные "хитрости", на мой взгляд, не должны применяться.

Возможно, более приемлемым была бы возможность применение ссылочного типа.  В целом задача - обращение к элементам массива без его копирования.

 
George Merts:

Да, реально я уже не могу придумать таких задач, в которых были бы необходимы внешние DLL.

Например, межтерминальные коммуникации.
 
Попробовал одного из своих роботов откомпилировать с оптимизацией.
Обнаружилось, что присвоение входного параметра полю deviation у экземляра структуры MqlTradeRequest приводит к ошибке генерации кода.
Гипотетический пример (всё остальное убрано):
sinput ulong deviation = 100;
int OnInit()
  {
        MqlTradeRequest request =
        {
                0
        };
        request.deviation = deviation;
//---
   return(INIT_SUCCEEDED);
  }

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
Получаю "code generation error        1    1"

Если присвоить просто "100":

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

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

...то компиляция пройдёт без ошибок. Обратите внимание, у меня процессор AMD Athlon II X4 645, 3.1 GHz. Быть может, это важно (буквально на этой неделе у MQL4 с сервисдеском вылавливали некий баг на AMD).

Ни на что другое компилятор у меня не ругается.

 
Спасибо за сообщение об ошибке - будем исправлять.